diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 5062708b906..f0eca184366 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -97,7 +97,7 @@ 1.13 4.7.2 0.7-groovy-2.0 - 4.0.6.RELEASE + 4.1.0.BUILD-SNAPSHOT 1.3.5.RELEASE 3.0.1.RELEASE Dijkstra-SR1 diff --git a/spring-boot/src/main/java/org/springframework/boot/env/YamlPropertySourceLoader.java b/spring-boot/src/main/java/org/springframework/boot/env/YamlPropertySourceLoader.java index ffc116a96eb..e12004d4e47 100644 --- a/spring-boot/src/main/java/org/springframework/boot/env/YamlPropertySourceLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/env/YamlPropertySourceLoader.java @@ -19,8 +19,8 @@ package org.springframework.boot.env; import java.io.IOException; import java.util.Properties; +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.boot.yaml.SpringProfileDocumentMatcher; -import org.springframework.boot.yaml.YamlPropertiesFactoryBean; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/ArrayDocumentMatcher.java b/spring-boot/src/main/java/org/springframework/boot/yaml/ArrayDocumentMatcher.java index 178a2019ee6..295f9be0d49 100644 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/ArrayDocumentMatcher.java +++ b/spring-boot/src/main/java/org/springframework/boot/yaml/ArrayDocumentMatcher.java @@ -19,8 +19,8 @@ package org.springframework.boot.yaml; import java.util.Properties; import java.util.Set; -import org.springframework.boot.yaml.YamlProcessor.DocumentMatcher; -import org.springframework.boot.yaml.YamlProcessor.MatchStatus; +import org.springframework.beans.factory.config.YamlProcessor.DocumentMatcher; +import org.springframework.beans.factory.config.YamlProcessor.MatchStatus; import org.springframework.util.StringUtils; /** diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/DefaultProfileDocumentMatcher.java b/spring-boot/src/main/java/org/springframework/boot/yaml/DefaultProfileDocumentMatcher.java index dd036df1778..08aa56008c5 100644 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/DefaultProfileDocumentMatcher.java +++ b/spring-boot/src/main/java/org/springframework/boot/yaml/DefaultProfileDocumentMatcher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,8 @@ package org.springframework.boot.yaml; import java.util.Properties; -import org.springframework.boot.yaml.YamlProcessor.DocumentMatcher; -import org.springframework.boot.yaml.YamlProcessor.MatchStatus; +import org.springframework.beans.factory.config.YamlProcessor.DocumentMatcher; +import org.springframework.beans.factory.config.YamlProcessor.MatchStatus; /** * A {@link DocumentMatcher} that matches the default profile implicitly but not diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/SpringProfileDocumentMatcher.java b/spring-boot/src/main/java/org/springframework/boot/yaml/SpringProfileDocumentMatcher.java index df2744c33c1..b82c18494ec 100644 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/SpringProfileDocumentMatcher.java +++ b/spring-boot/src/main/java/org/springframework/boot/yaml/SpringProfileDocumentMatcher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Properties; -import org.springframework.boot.yaml.YamlProcessor.DocumentMatcher; -import org.springframework.boot.yaml.YamlProcessor.MatchStatus; +import org.springframework.beans.factory.config.YamlProcessor.DocumentMatcher; +import org.springframework.beans.factory.config.YamlProcessor.MatchStatus; import org.springframework.core.env.Environment; /** diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlMapFactoryBean.java b/spring-boot/src/main/java/org/springframework/boot/yaml/YamlMapFactoryBean.java deleted file mode 100644 index bd777ea707b..00000000000 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlMapFactoryBean.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2012 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; - -import org.springframework.beans.factory.FactoryBean; - -/** - * Factory for Map 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. If multiple resources are - * provided the later ones will override entries in the earlier ones hierarchically - that - * is all entries with the same nested key of type Map at any depth are merged. For - * example: - * - *
- * foo:
- *   bar:
- *    one: two
- * three: four
- *
- * 
- * - * plus (later in the list) - * - *
- * foo:
- *   bar:
- *    one: 2
- * five: six
- *
- * 
- * - * results in an effecive input of - * - *
- * foo:
- *   bar:
- *    one: 2
- *    three: four
- * five: six
- *
- * 
- * - * Note that the value of "foo" in the first document is not simply replaced with the - * value in the second, but its nested values are merged. - * - * @author Dave Syer - */ -public class YamlMapFactoryBean extends YamlProcessor implements - FactoryBean> { - - private boolean singleton = true; - - private Map instance; - - @Override - public Map getObject() { - if (!this.singleton || this.instance == null) { - final Map result = new LinkedHashMap(); - process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - merge(result, map); - } - }); - this.instance = result; - } - return this.instance; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void merge(Map output, Map map) { - for (Entry entry : map.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - Object existing = output.get(key); - if (value instanceof Map && existing instanceof Map) { - Map result = new LinkedHashMap( - (Map) existing); - merge(result, (Map) value); - output.put(key, result); - } - else { - output.put(key, value); - } - } - } - - @Override - public Class getObjectType() { - return Map.class; - } - - /** - * Set if a singleton should be created, or a new object on each request otherwise. - * Default is true (a singleton). - */ - public void setSingleton(boolean singleton) { - this.singleton = singleton; - } - - @Override - public boolean isSingleton() { - return this.singleton; - } - -} diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlProcessor.java b/spring-boot/src/main/java/org/springframework/boot/yaml/YamlProcessor.java deleted file mode 100644 index 818401ba266..00000000000 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlProcessor.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright 2012-2014 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; -import org.yaml.snakeyaml.Yaml; - -/** - * Base class for Yaml factories. - * - * @author Dave Syer - */ -public abstract class YamlProcessor { - - private final Log logger = LogFactory.getLog(getClass()); - - private ResolutionMethod resolutionMethod = ResolutionMethod.OVERRIDE; - - private Resource[] resources = new Resource[0]; - - private List documentMatchers = Collections.emptyList(); - - private boolean matchDefault = true; - - /** - * A map of document matchers allowing callers to selectively use only some of the - * documents in a YAML resource. In YAML documents are separated by --- - * lines, and each document is converted to properties before the match is made. E.g. - * - *
-	 * environment: dev
-	 * url: http://dev.bar.com
-	 * name: Developer Setup
-	 * ---
-	 * environment: prod
-	 * url:http://foo.bar.com
-	 * name: My Cool App
-	 * 
- * - * when mapped with - * documentMatchers = YamlProcessor.mapMatcher({"environment": "prod"}) - * would end up as - * - *
-	 * environment=prod
-	 * url=http://foo.bar.com
-	 * name=My Cool App
-	 * url=http://dev.bar.com
-	 * 
- * @param matchers a map of keys to value patterns (regular expressions) - */ - public void setDocumentMatchers(DocumentMatcher... matchers) { - this.documentMatchers = Collections - .unmodifiableList(new ArrayList(Arrays.asList(matchers))); - } - - /** - * Flag indicating that a document for which all the - * {@link #setDocumentMatchers(DocumentMatcher...) document matchers} abstain will - * nevertheless match. - * @param matchDefault the flag to set (default true) - */ - public void setMatchDefault(boolean matchDefault) { - this.matchDefault = matchDefault; - } - - /** - * Method to use for resolving resources. Each resource will be converted to a Map, so - * this property is used to decide which map entries to keep in the final output from - * this factory. - * @param resolutionMethod the resolution method to set (defaults to - * {@link ResolutionMethod#OVERRIDE}). - */ - public void setResolutionMethod(ResolutionMethod resolutionMethod) { - Assert.notNull(resolutionMethod, "ResolutionMethod must not be null"); - this.resolutionMethod = resolutionMethod; - } - - /** - * @param resources the resources to set - */ - public void setResources(Resource[] resources) { - this.resources = (resources == null ? null : resources.clone()); - } - - /** - * Provides an opportunity for subclasses to process the Yaml parsed from the supplied - * resources. Each resource is parsed in turn and the documents inside checked against - * the {@link #setDocumentMatchers(DocumentMatcher...) matchers}. If a document - * matches it is passed into the callback, along with its representation as - * Properties. Depending on the {@link #setResolutionMethod(ResolutionMethod)} not all - * of the documents will be parsed. - * @param callback a callback to delegate to once matching documents are found - */ - protected void process(MatchCallback callback) { - Yaml yaml = new Yaml(); - for (Resource resource : this.resources) { - boolean found = process(callback, yaml, resource); - if (this.resolutionMethod == ResolutionMethod.FIRST_FOUND && found) { - return; - } - } - } - - private boolean process(MatchCallback callback, Yaml yaml, Resource resource) { - int count = 0; - try { - if (this.logger.isDebugEnabled()) { - this.logger.debug("Loading from YAML: " + resource); - } - for (Object object : yaml.loadAll(resource.getInputStream())) { - if (object != null && process(asMap(object), callback)) { - count++; - if (this.resolutionMethod == ResolutionMethod.FIRST_FOUND) { - break; - } - } - } - if (this.logger.isDebugEnabled()) { - this.logger.debug("Loaded " + count + " document" - + (count > 1 ? "s" : "") + " from YAML resource: " + resource); - } - } - catch (IOException ex) { - handleProcessError(resource, ex); - } - return count > 0; - } - - private void handleProcessError(Resource resource, IOException ex) { - if (this.resolutionMethod != ResolutionMethod.FIRST_FOUND - && this.resolutionMethod != ResolutionMethod.OVERRIDE_AND_IGNORE) { - throw new IllegalStateException(ex); - } - if (this.logger.isWarnEnabled()) { - this.logger.warn("Could not load map from " + resource + ": " - + ex.getMessage()); - } - } - - @SuppressWarnings("unchecked") - private Map asMap(Object object) { - // YAML can have numbers as keys - Map result = new LinkedHashMap(); - if (!(object instanceof Map)) { - // A document can be a text literal - result.put("document", object); - return result; - } - - Map map = (Map) object; - for (Entry entry : map.entrySet()) { - Object value = entry.getValue(); - if (value instanceof Map) { - value = asMap(value); - } - Object key = entry.getKey(); - if (key instanceof CharSequence) { - result.put(key.toString(), value); - } - else { - // It has to be a map key in this case - result.put("[" + key.toString() + "]", value); - } - } - return result; - } - - private boolean process(Map map, MatchCallback callback) { - - Properties properties = new Properties(); - assignProperties(properties, map, null); - - if (this.documentMatchers.isEmpty()) { - if (this.logger.isDebugEnabled()) { - this.logger.debug("Merging document (no matchers set)" + map); - } - callback.process(properties, map); - return true; - } - - MatchStatus result = MatchStatus.ABSTAIN; - for (DocumentMatcher matcher : this.documentMatchers) { - MatchStatus match = matcher.matches(properties); - result = MatchStatus.getMostSpecific(match, result); - if (match == MatchStatus.FOUND) { - if (this.logger.isDebugEnabled()) { - this.logger.debug("Matched document with document matcher: " - + properties); - } - callback.process(properties, map); - return true; - } - } - - if (result == MatchStatus.ABSTAIN && this.matchDefault) { - if (this.logger.isDebugEnabled()) { - this.logger.debug("Matched document with default matcher: " + map); - } - callback.process(properties, map); - return true; - } - - this.logger.debug("Unmatched document"); - return false; - } - - private void assignProperties(Properties properties, Map input, - String path) { - for (Entry entry : input.entrySet()) { - String key = entry.getKey(); - if (StringUtils.hasText(path)) { - if (key.startsWith("[")) { - key = path + key; - } - else { - key = path + "." + key; - } - } - Object value = entry.getValue(); - if (value instanceof String) { - properties.put(key, value); - } - else if (value instanceof Map) { - // Need a compound key - @SuppressWarnings("unchecked") - Map map = (Map) value; - assignProperties(properties, map, key); - } - else if (value instanceof Collection) { - // Need a compound key - @SuppressWarnings("unchecked") - Collection collection = (Collection) value; - int count = 0; - for (Object object : collection) { - assignProperties(properties, - Collections.singletonMap("[" + (count++) + "]", object), key); - } - } - else { - properties.put(key, value == null ? "" : value); - } - } - } - - /** - * Callback interface used to process properties in a resulting map. - */ - public interface MatchCallback { - - /** - * Process the properties. - * @param properties the properties to process - * @param map a mutable result map - */ - void process(Properties properties, Map map); - - } - - /** - * Strategy interface used the test if properties match. - */ - public interface DocumentMatcher { - - /** - * Test if the given properties match. - * @param properties the properties to test - * @return the status of the match. - */ - MatchStatus matches(Properties properties); - - } - - /** - * Status returned from {@link DocumentMatcher#matches(Properties)} - */ - public static enum MatchStatus { - - /** - * A match was found. - */ - FOUND, - - /** - * No match was found. - */ - NOT_FOUND, - - /** - * The matcher should not be considered. - */ - ABSTAIN; - - /** - * Compare two {@link MatchStatus} items, returning the most specific status. - */ - public static MatchStatus getMostSpecific(MatchStatus a, MatchStatus b) { - return a.ordinal() < b.ordinal() ? a : b; - } - } - - /** - * Resolution methods. - */ - public static enum ResolutionMethod { - - /** - * Replace values from earlier in the list. - */ - OVERRIDE, - - /** - * Replace values from earlier in the list, ignoring any failures. - */ - OVERRIDE_AND_IGNORE, - - /** - * Take the first resource in the list that exists and use just that. - */ - FIRST_FOUND - } - -} diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlPropertiesFactoryBean.java b/spring-boot/src/main/java/org/springframework/boot/yaml/YamlPropertiesFactoryBean.java deleted file mode 100644 index 71371b71b83..00000000000 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/YamlPropertiesFactoryBean.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2012 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.util.Map; -import java.util.Properties; - -import org.springframework.beans.factory.FactoryBean; - -/** - * 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 - * - *
- * environments:
- *   dev:
- *     url: http://dev.bar.com
- *     name: Developer Setup
- *   prod:
- *     url: http://foo.bar.com
- *     name: My Cool App
- * 
- * - * is transformed into these Properties: - * - *
- * 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
- * 
- * - * Lists are represented as comma-separated values (useful for simple String values) and - * also as property keys with [] dereferencers, for example this YAML: - * - *
- * servers:
- * - dev.bar.com
- * - foo.bar.com
- * 
- * - * becomes java Properties like this: - * - *
- * servers=dev.bar.com,foo.bar.com
- * servers[0]=dev.bar.com
- * servers[1]=foo.bar.com
- * 
- * - * @author Dave Syer - */ -public class YamlPropertiesFactoryBean extends YamlProcessor implements - FactoryBean { - - private boolean singleton = true; - - private Properties instance; - - @Override - public Properties getObject() { - if (!this.singleton || this.instance == null) { - final Properties result = new Properties(); - process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - result.putAll(properties); - } - }); - this.instance = result; - } - return this.instance; - } - - @Override - public Class getObjectType() { - return Properties.class; - } - - /** - * Set if a singleton should be created, or a new object on each request otherwise. - * Default is true (a singleton). - */ - public void setSingleton(boolean singleton) { - this.singleton = singleton; - } - - @Override - public boolean isSingleton() { - return this.singleton; - } - -} diff --git a/spring-boot/src/main/java/org/springframework/boot/yaml/package-info.java b/spring-boot/src/main/java/org/springframework/boot/yaml/package-info.java index f59f991b7ad..d3df3d03197 100644 --- a/spring-boot/src/main/java/org/springframework/boot/yaml/package-info.java +++ b/spring-boot/src/main/java/org/springframework/boot/yaml/package-info.java @@ -15,10 +15,10 @@ */ /** - * Support for parsing YAML. + * Spring Boot extensions to Spring Framework's support for parsing YAML. * - * @see org.springframework.boot.yaml.YamlPropertiesFactoryBean - * @see org.springframework.boot.yaml.YamlMapFactoryBean + * @see org.springframework.beans.factory.config.YamlPropertiesFactoryBean + * @see org.springframework.beans.factory.config.YamlMapFactoryBean */ package org.springframework.boot.yaml; diff --git a/spring-boot/src/test/java/org/springframework/boot/yaml/ArrayDocumentMatcherTests.java b/spring-boot/src/test/java/org/springframework/boot/yaml/ArrayDocumentMatcherTests.java index a0b643ddc1f..bbcf93b7baf 100644 --- a/spring-boot/src/test/java/org/springframework/boot/yaml/ArrayDocumentMatcherTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/yaml/ArrayDocumentMatcherTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import java.io.IOException; import java.util.Properties; import org.junit.Test; -import org.springframework.boot.yaml.YamlProcessor.MatchStatus; +import org.springframework.beans.factory.config.YamlProcessor.MatchStatus; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.support.PropertiesLoaderUtils; diff --git a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlMapFactoryBeanTests.java b/spring-boot/src/test/java/org/springframework/boot/yaml/YamlMapFactoryBeanTests.java deleted file mode 100644 index 4da83d7cdb2..00000000000 --- a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlMapFactoryBeanTests.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2012-2013 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.junit.Test; -import org.springframework.boot.yaml.YamlProcessor.ResolutionMethod; -import org.springframework.core.io.AbstractResource; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * Tests for {@link YamlMapFactoryBean}. - * - * @author Dave Syer - */ -public class YamlMapFactoryBeanTests { - - private final YamlMapFactoryBean factory = new YamlMapFactoryBean(); - - @Test - public void testSetIgnoreResourceNotFound() throws Exception { - this.factory - .setResolutionMethod(YamlMapFactoryBean.ResolutionMethod.OVERRIDE_AND_IGNORE); - this.factory.setResources(new FileSystemResource[] { new FileSystemResource( - "non-exsitent-file.yml") }); - assertEquals(0, this.factory.getObject().size()); - } - - @Test(expected = IllegalStateException.class) - public void testSetBarfOnResourceNotFound() throws Exception { - this.factory.setResources(new FileSystemResource[] { new FileSystemResource( - "non-exsitent-file.yml") }); - assertEquals(0, this.factory.getObject().size()); - } - - @Test - public void testGetObject() throws Exception { - this.factory.setResources(new ByteArrayResource[] { new ByteArrayResource( - "foo: bar".getBytes()) }); - assertEquals(1, this.factory.getObject().size()); - } - - @SuppressWarnings("unchecked") - @Test - public void testOverrideAndremoveDefaults() throws Exception { - this.factory.setResources(new ByteArrayResource[] { - new ByteArrayResource("foo:\n bar: spam".getBytes()), - new ByteArrayResource("foo:\n spam: bar".getBytes()) }); - assertEquals(1, this.factory.getObject().size()); - assertEquals(2, - ((Map) this.factory.getObject().get("foo")).size()); - } - - @Test - public void testFirstFound() throws Exception { - this.factory.setResolutionMethod(ResolutionMethod.FIRST_FOUND); - this.factory.setResources(new Resource[] { new AbstractResource() { - @Override - public String getDescription() { - return "non-existent"; - } - - @Override - public InputStream getInputStream() throws IOException { - throw new IOException("planned"); - } - }, new ByteArrayResource("foo:\n spam: bar".getBytes()) }); - assertEquals(1, this.factory.getObject().size()); - } - - @Test - public void testMapWithPeriodsInKey() throws Exception { - this.factory.setResources(new ByteArrayResource[] { new ByteArrayResource( - "foo:\n ? key1.key2\n : value".getBytes()) }); - Map map = this.factory.getObject(); - assertEquals(1, map.size()); - assertTrue(map.containsKey("foo")); - Object object = map.get("foo"); - assertTrue(object instanceof LinkedHashMap); - @SuppressWarnings("unchecked") - Map sub = (Map) object; - assertTrue(sub.containsKey("key1.key2")); - assertEquals("value", sub.get("key1.key2")); - } - -} diff --git a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlProcessorTests.java b/spring-boot/src/test/java/org/springframework/boot/yaml/YamlProcessorTests.java deleted file mode 100644 index 613dc14ab66..00000000000 --- a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlProcessorTests.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2012-2014 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.util.Map; -import java.util.Properties; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.springframework.boot.yaml.YamlProcessor.MatchCallback; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.Resource; -import org.yaml.snakeyaml.parser.ParserException; -import org.yaml.snakeyaml.scanner.ScannerException; - -import static org.junit.Assert.assertEquals; - -/** - * Tests for {@link YamlProcessor}. - * - * @author Dave Syer - */ -public class YamlProcessorTests { - - private final YamlProcessor processor = new YamlProcessor() { - }; - - @Rule - public ExpectedException exception = ExpectedException.none(); - - @Test - public void arrayConvertedToIndexedBeanReference() { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nbar: [1,2,3]".getBytes()) }); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - assertEquals(1, properties.get("bar[0]")); - assertEquals(2, properties.get("bar[1]")); - assertEquals(3, properties.get("bar[2]")); - assertEquals(4, properties.size()); - } - }); - } - - @Test - public void testStringResource() throws Exception { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo # a document that is a literal".getBytes()) }); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - assertEquals("foo", map.get("document")); - } - }); - } - - @Test - public void testBadDocumentStart() throws Exception { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo # a document\nbar: baz".getBytes()) }); - this.exception.expect(ParserException.class); - this.exception.expectMessage("line 2, column 1"); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - } - }); - } - - @Test - public void testBadResource() throws Exception { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\ncd\nspam:\n foo: baz".getBytes()) }); - this.exception.expect(ScannerException.class); - this.exception.expectMessage("line 3, column 1"); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - } - }); - } - - @Test - public void mapConvertedToIndexedBeanReference() { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nbar:\n spam: bucket".getBytes()) }); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - // System.err.println(properties); - assertEquals("bucket", properties.get("bar.spam")); - assertEquals(2, properties.size()); - } - }); - } - - @Test - public void integerKeyBehaves() { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\n1: bar".getBytes()) }); - this.processor.process(new MatchCallback() { - @Override - public void process(Properties properties, Map map) { - assertEquals("bar", properties.get("[1]")); - assertEquals(2, properties.size()); - } - }); - } - - @Test - public void integerDeepKeyBehaves() { - this.processor.setResources(new Resource[] { new ByteArrayResource( - "foo:\n 1: bar".getBytes()) }); - this.processor.process(new MatchCallback() { - - @Override - public void process(Properties properties, Map map) { - assertEquals("bar", properties.get("foo[1]")); - assertEquals(1, properties.size()); - } - }); - } -} diff --git a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlPropertiesFactoryBeanTests.java b/spring-boot/src/test/java/org/springframework/boot/yaml/YamlPropertiesFactoryBeanTests.java deleted file mode 100644 index 636d7fb1afb..00000000000 --- a/spring-boot/src/test/java/org/springframework/boot/yaml/YamlPropertiesFactoryBeanTests.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright 2012-2014 the original author or authors. - * - * 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 org.springframework.boot.yaml; - -import java.util.Map; -import java.util.Properties; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.springframework.boot.yaml.YamlProcessor.DocumentMatcher; -import org.springframework.boot.yaml.YamlProcessor.MatchStatus; -import org.springframework.boot.yaml.YamlProcessor.ResolutionMethod; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.scanner.ScannerException; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.assertThat; - -/** - * Tests for {@link YamlPropertiesFactoryBean}. - * - * @author Dave Syer - */ -public class YamlPropertiesFactoryBeanTests { - - @Rule - public ExpectedException exception = ExpectedException.none(); - - @Test - public void testLoadResource() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nspam:\n foo: baz".getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bar")); - assertThat(properties.getProperty("spam.foo"), equalTo("baz")); - } - - @Test - public void testBadResource() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\ncd\nspam:\n foo: baz".getBytes()) }); - this.exception.expect(ScannerException.class); - this.exception.expectMessage("line 3, column 1"); - factory.getObject(); - } - - @Test - public void testLoadResourcesWithOverride() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { - new ByteArrayResource("foo: bar\nspam:\n foo: baz".getBytes()), - new ByteArrayResource("foo:\n bar: spam".getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bar")); - assertThat(properties.getProperty("spam.foo"), equalTo("baz")); - assertThat(properties.getProperty("foo.bar"), equalTo("spam")); - } - - @Test - @Ignore("We can't fail on duplicate keys because the Map is created by the YAML library") - public void testLoadResourcesWithInternalOverride() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nspam:\n foo: baz\nfoo: bucket".getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bar")); - } - - @Test - @Ignore("We can't fail on duplicate keys because the Map is created by the YAML library") - public void testLoadResourcesWithNestedInternalOverride() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo:\n bar: spam\n foo: baz\nbreak: it\nfoo: bucket".getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo.bar"), equalTo("spam")); - } - - @Test - public void testLoadResourceWithMultipleDocuments() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nspam: baz\n---\nfoo: bag".getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bag")); - assertThat(properties.getProperty("spam"), equalTo("baz")); - } - - @Test - public void testLoadResourceWithSelectedDocuments() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()) }); - factory.setDocumentMatchers(new DocumentMatcher() { - @Override - public MatchStatus matches(Properties properties) { - return "bag".equals(properties.getProperty("foo")) ? MatchStatus.FOUND - : MatchStatus.NOT_FOUND; - } - }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bag")); - assertThat(properties.getProperty("spam"), equalTo("bad")); - } - - @Test - public void testLoadResourceWithDefaultMatch() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setMatchDefault(true); - factory.setResources(new Resource[] { new ByteArrayResource( - "one: two\n---\nfoo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()) }); - factory.setDocumentMatchers(new DocumentMatcher() { - @Override - public MatchStatus matches(Properties properties) { - if (!properties.containsKey("foo")) { - return MatchStatus.ABSTAIN; - } - return "bag".equals(properties.getProperty("foo")) ? MatchStatus.FOUND - : MatchStatus.NOT_FOUND; - } - }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bag")); - assertThat(properties.getProperty("spam"), equalTo("bad")); - assertThat(properties.getProperty("one"), equalTo("two")); - } - - @Test - public void testLoadResourceWithoutDefaultMatch() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setMatchDefault(false); - factory.setResources(new Resource[] { new ByteArrayResource( - "one: two\n---\nfoo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()) }); - factory.setDocumentMatchers(new DocumentMatcher() { - @Override - public MatchStatus matches(Properties properties) { - if (!properties.containsKey("foo")) { - return MatchStatus.ABSTAIN; - } - return "bag".equals(properties.getProperty("foo")) ? MatchStatus.FOUND - : MatchStatus.NOT_FOUND; - } - }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bag")); - assertThat(properties.getProperty("spam"), equalTo("bad")); - assertThat(properties.getProperty("one"), nullValue()); - } - - @Test - public void testLoadResourceWithDefaultMatchSkippingMissedMatch() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setMatchDefault(true); - factory.setResources(new Resource[] { new ByteArrayResource( - "one: two\n---\nfoo: bag\nspam: bad\n---\nfoo: bar\nspam: baz".getBytes()) }); - factory.setDocumentMatchers(new DocumentMatcher() { - @Override - public MatchStatus matches(Properties properties) { - if (!properties.containsKey("foo")) { - return MatchStatus.ABSTAIN; - } - return "bag".equals(properties.getProperty("foo")) ? MatchStatus.FOUND - : MatchStatus.NOT_FOUND; - } - }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bag")); - assertThat(properties.getProperty("spam"), equalTo("bad")); - assertThat(properties.getProperty("one"), equalTo("two")); - } - - @Test - public void testLoadNonExistentResource() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResolutionMethod(ResolutionMethod.OVERRIDE_AND_IGNORE); - factory.setResources(new Resource[] { new ClassPathResource("no-such-file.yml") }); - Properties properties = factory.getObject(); - assertThat(properties.size(), equalTo(0)); - } - - @Test - public void testLoadNull() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource("foo: bar\nspam:" - .getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo"), equalTo("bar")); - assertThat(properties.getProperty("spam"), equalTo("")); - } - - @Test - public void testLoadArrayOfString() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource("foo:\n- bar\n- baz" - .getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo[0]"), equalTo("bar")); - assertThat(properties.getProperty("foo[1]"), equalTo("baz")); - } - - @Test - public void testLoadArrayOfObject() throws Exception { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(new Resource[] { new ByteArrayResource( - "foo:\n- bar:\n spam: crap\n- baz\n- one: two\n three: four" - .getBytes()) }); - Properties properties = factory.getObject(); - assertThat(properties.getProperty("foo[0].bar.spam"), equalTo("crap")); - assertThat(properties.getProperty("foo[1]"), equalTo("baz")); - assertThat(properties.getProperty("foo[2].one"), equalTo("two")); - assertThat(properties.getProperty("foo[2].three"), equalTo("four")); - } - - @SuppressWarnings("unchecked") - @Test - public void testYaml() { - Yaml yaml = new Yaml(); - Map map = yaml.loadAs("foo: bar\nspam:\n foo: baz", Map.class); - assertThat(map.get("foo"), equalTo((Object) "bar")); - assertThat(((Map) map.get("spam")).get("foo"), - equalTo((Object) "baz")); - } - -}