TAMAYA-252: Clarified PropertyValue API.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/8c0081b9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/8c0081b9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/8c0081b9 Branch: refs/heads/master Commit: 8c0081b9a8f6123f080bdd4c4b33dc0c62fde451 Parents: b59c1ae Author: anatole <[email protected]> Authored: Fri Mar 3 22:27:02 2017 +0100 Committer: anatole <[email protected]> Committed: Mon Mar 6 00:29:34 2017 +0100 ---------------------------------------------------------------------- .../org/apache/tamaya/spi/PropertyValue.java | 60 +++++++++++++---- .../apache/tamaya/spi/PropertyValueBuilder.java | 70 +++++++++++++++++--- 2 files changed, 108 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8c0081b9/code/api/src/main/java/org/apache/tamaya/spi/PropertyValue.java ---------------------------------------------------------------------- diff --git a/code/api/src/main/java/org/apache/tamaya/spi/PropertyValue.java b/code/api/src/main/java/org/apache/tamaya/spi/PropertyValue.java index 30afeab..0332b85 100644 --- a/code/api/src/main/java/org/apache/tamaya/spi/PropertyValue.java +++ b/code/api/src/main/java/org/apache/tamaya/spi/PropertyValue.java @@ -18,6 +18,7 @@ */ package org.apache.tamaya.spi; +import java.io.Serializable; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -29,18 +30,21 @@ import java.util.Objects; * it is possible to create a PropertyValue with a null value. Nevertheless in all cases the provider source (typically * the name of the PropertySource) must be set. */ -public final class PropertyValue { +public final class PropertyValue implements Serializable{ + private static final long serialVersionUID = 1L; /** The requested key. */ private String key; + /** The value. */ + private String value; /** Additional metadata provided by the provider. */ - private Map<String,String> configEntries = new HashMap<>(); + private Map<String,String> metaEntries = new HashMap<>(); PropertyValue(PropertyValueBuilder builder){ this.key = builder.key; - if(builder.contextData!=null) { - this.configEntries.putAll(builder.contextData); + this.value = Objects.requireNonNull(builder.value); + if(builder.metaEntries !=null) { + this.metaEntries.putAll(builder.metaEntries); } - this.configEntries.put(key, Objects.requireNonNull(builder.value)); } /** @@ -51,8 +55,8 @@ public final class PropertyValue { */ private PropertyValue(String key, String value, String source){ this.key = Objects.requireNonNull(key, "key is required."); - this.configEntries.put(key, value); - this.configEntries.put("_"+key+".source", Objects.requireNonNull(source, "source is required.")); + this.value = Objects.requireNonNull(value); + this.metaEntries.put("_"+key+".source", Objects.requireNonNull(source, "source is required.")); } /** @@ -69,7 +73,7 @@ public final class PropertyValue { * {@link PropertySource#get(String)}. */ public String getValue() { - return configEntries.get(key); + return this.value; } /** @@ -77,8 +81,8 @@ public final class PropertyValue { * is also used for subsequent processing, like value filtering. * @return the property value entry map. */ - public Map<String, String> getConfigEntries() { - return Collections.unmodifiableMap(configEntries); + public Map<String, String> getMetaEntries() { + return Collections.unmodifiableMap(metaEntries); } /** @@ -111,7 +115,39 @@ public final class PropertyValue { * @param key the key, not null. * @return the value found, or null. */ - public String get(String key) { - return this.configEntries.get(key); + public String getMetaEntry(String key) { + return this.metaEntries.get(key); + } + + /** + * Creates a new builder instance based on this item. + * @return a new builder, never null. + */ + public PropertyValueBuilder toBuilder() { + return new PropertyValueBuilder(this.getKey(), this.getValue(), this.metaEntries); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PropertyValue)) return false; + PropertyValue that = (PropertyValue) o; + return Objects.equals(getKey(), that.getKey()) && + Objects.equals(getValue(), that.getValue()) && + Objects.equals(getMetaEntries(), that.getMetaEntries()); + } + + @Override + public int hashCode() { + return Objects.hash(getKey(), getValue(), getMetaEntries()); + } + + @Override + public String toString() { + return "PropertyValue{" + + "key='" + key + '\'' + + ", value='" + value + '\'' + + ", metaEntries=" + metaEntries + + '}'; } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8c0081b9/code/api/src/main/java/org/apache/tamaya/spi/PropertyValueBuilder.java ---------------------------------------------------------------------- diff --git a/code/api/src/main/java/org/apache/tamaya/spi/PropertyValueBuilder.java b/code/api/src/main/java/org/apache/tamaya/spi/PropertyValueBuilder.java index 7eaeb94..57a40be 100644 --- a/code/api/src/main/java/org/apache/tamaya/spi/PropertyValueBuilder.java +++ b/code/api/src/main/java/org/apache/tamaya/spi/PropertyValueBuilder.java @@ -18,6 +18,7 @@ */ package org.apache.tamaya.spi; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -31,7 +32,7 @@ public class PropertyValueBuilder { /** The property value. */ String value; /** additional metadata entries (optional). */ - Map<String,String> contextData = new HashMap<>(); + Map<String,String> metaEntries = new HashMap<>(); /** * Create a new builder instance, for a given set of parameters. @@ -43,12 +44,25 @@ public class PropertyValueBuilder { public PropertyValueBuilder(String key, String value, String source) { this.key = Objects.requireNonNull(key); this.value = Objects.requireNonNull(value); - this.contextData.put("_" + key + ".source", Objects.requireNonNull(source)); + this.metaEntries.put("source", Objects.requireNonNull(source)); + } + + /** + * Creates a new builder from data from a {@link PropertyValue}. + * @param key to access a property value. + * @param value the value, not null. If a value is null {@link PropertySource#get(String)} should return + * {@code null}. + * @param metaEntries the context data, not null. + */ + PropertyValueBuilder(String key, String value, Map<String,String> metaEntries) { + this.key = Objects.requireNonNull(key); + this.value = Objects.requireNonNull(value); + this.metaEntries.putAll(metaEntries); } /** * Replaces/sets the context data. - * @param contextData the context data to be applied, not null. Note that all keys should only identify the context + * @param metaEntries the context data to be applied, not null. Note that all keys should only identify the context * data item. the builder does create a corresponding metadata entry, e.g. * <pre> * provider=myProviderName @@ -65,11 +79,9 @@ public class PropertyValueBuilder { * </pre> * @return the builder for chaining. */ - public PropertyValueBuilder setContextData(Map<String, String> contextData) { - this.contextData.clear(); - for(Map.Entry<String,String> en:contextData.entrySet()) { - this.contextData.put("_"+this.key+'.'+en.getKey(), en.getValue()); - } + public PropertyValueBuilder setMetaEntries(Map<String, String> metaEntries) { + this.metaEntries.clear(); + this.metaEntries.putAll(metaEntries); return this; } @@ -80,7 +92,44 @@ public class PropertyValueBuilder { * @return the builder for chaining. */ public PropertyValueBuilder addContextData(String key, Object value) { - this.contextData.put("_"+this.key+'.'+key, String.valueOf(Objects.requireNonNull(value, "Meta value is null."))); + this.metaEntries.put(key, String.valueOf(Objects.requireNonNull(value, "Meta value is null."))); + return this; + } + + /** + * Get the value's context data. + * @return the context data. + */ + public Map<String,String> getMetaEntries(){ + return Collections.unmodifiableMap(this.metaEntries); + } + + /** + * Changes the entry's key, mapping also corresponding context entries. + * @param key the new key, not null. + * @return the builder for chaining. + */ + public PropertyValueBuilder mapKey(String key) { + Map<String,String> newContext = new HashMap<>(); + for(Map.Entry<String,String> en:this.metaEntries.entrySet()){ + if(en.getKey().startsWith("_"+this.key)){ + newContext.put("_"+key+'.'+ en.getKey().substring(this.key.length()+1), en.getValue()); + }else{ + newContext.put(en.getKey(), en.getValue()); + } + } + this.metaEntries = newContext; + this.key = key; + return this; + } + + /** + * Sets a new value. + * @param value the new value. + * @return the builder for chaining. + */ + public PropertyValueBuilder setValue(String value) { + this.value = value; return this; } @@ -97,7 +146,8 @@ public class PropertyValueBuilder { return "PropertyValueBuilder{" + "key='" + key + '\'' + "value='" + value + '\'' + - ", contextData=" + contextData + + ", metaEntries=" + metaEntries + '}'; } + }
