diff --git a/akka-actor/src/main/java/com/typesafe/config/Config.java b/akka-actor/src/main/java/com/typesafe/config/Config.java old mode 100644 new mode 100755 index febeece3e2..629b107be9 --- a/akka-actor/src/main/java/com/typesafe/config/Config.java +++ b/akka-actor/src/main/java/com/typesafe/config/Config.java @@ -418,7 +418,7 @@ public interface Config extends ConfigMergeable { * units suffixes like "10m" or "5ns" as documented in the the * spec. - * + * * @param path * path expression * @return the duration value at the requested path, in milliseconds @@ -487,4 +487,23 @@ public interface Config extends ConfigMergeable { List getMillisecondsList(String path); List getNanosecondsList(String path); + + /** + * Clone the config with only the given path (and its children) retained; + * all sibling paths are removed. + * + * @param path + * path to keep + * @return a copy of the config minus all paths except the one specified + */ + Config withOnlyPath(String path); + + /** + * Clone the config with the given path removed. + * + * @param path + * path to remove + * @return a copy of the config minus the specified path + */ + Config withoutPath(String path); } diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigException.java b/akka-actor/src/main/java/com/typesafe/config/ConfigException.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigFactory.java b/akka-actor/src/main/java/com/typesafe/config/ConfigFactory.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigIncludeContext.java b/akka-actor/src/main/java/com/typesafe/config/ConfigIncludeContext.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigIncluder.java b/akka-actor/src/main/java/com/typesafe/config/ConfigIncluder.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigList.java b/akka-actor/src/main/java/com/typesafe/config/ConfigList.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigMergeable.java b/akka-actor/src/main/java/com/typesafe/config/ConfigMergeable.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigObject.java b/akka-actor/src/main/java/com/typesafe/config/ConfigObject.java old mode 100644 new mode 100755 index 16b9837f6d..285bf04e7f --- a/akka-actor/src/main/java/com/typesafe/config/ConfigObject.java +++ b/akka-actor/src/main/java/com/typesafe/config/ConfigObject.java @@ -91,4 +91,23 @@ public interface ConfigObject extends ConfigValue, Map { */ @Override ConfigValue get(Object key); + + /** + * Clone the object with only the given key (and its children) retained; all + * sibling keys are removed. + * + * @param key + * key to keep + * @return a copy of the object minus all keys except the one specified + */ + ConfigObject withOnlyKey(String key); + + /** + * Clone the object with the given key removed. + * + * @param key + * key to remove + * @return a copy of the object minus the specified key + */ + ConfigObject withoutKey(String key); } diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigOrigin.java b/akka-actor/src/main/java/com/typesafe/config/ConfigOrigin.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigParseOptions.java b/akka-actor/src/main/java/com/typesafe/config/ConfigParseOptions.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigParseable.java b/akka-actor/src/main/java/com/typesafe/config/ConfigParseable.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigResolveOptions.java b/akka-actor/src/main/java/com/typesafe/config/ConfigResolveOptions.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigSyntax.java b/akka-actor/src/main/java/com/typesafe/config/ConfigSyntax.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigUtil.java b/akka-actor/src/main/java/com/typesafe/config/ConfigUtil.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigValue.java b/akka-actor/src/main/java/com/typesafe/config/ConfigValue.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigValueFactory.java b/akka-actor/src/main/java/com/typesafe/config/ConfigValueFactory.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/ConfigValueType.java b/akka-actor/src/main/java/com/typesafe/config/ConfigValueType.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigObject.java b/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigObject.java old mode 100644 new mode 100755 index 6f9fd542ff..c5031fe568 --- a/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigObject.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigObject.java @@ -43,6 +43,18 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements return this; } + @Override + abstract public AbstractConfigObject withOnlyKey(String key); + + @Override + abstract public AbstractConfigObject withoutKey(String key); + + abstract protected AbstractConfigObject withOnlyPathOrNull(Path path); + + abstract AbstractConfigObject withOnlyPath(Path path); + + abstract AbstractConfigObject withoutPath(Path path); + /** * This looks up the key with no transformation or type conversion of any * kind, and returns null if the key is not present. diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java b/akka-actor/src/main/java/com/typesafe/config/impl/AbstractConfigValue.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigBoolean.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigBoolean.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java old mode 100644 new mode 100755 index b64712ebd5..49eae37c97 --- a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java @@ -25,6 +25,8 @@ import com.typesafe.config.ConfigValueType; final class ConfigDelayedMerge extends AbstractConfigValue implements Unmergeable { + private static final long serialVersionUID = 1L; + // earlier items in the stack win final private List stack; final private boolean ignoresFallbacks; diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java old mode 100644 new mode 100755 index c290c47fa5..fa873d9df9 --- a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java @@ -18,9 +18,11 @@ import com.typesafe.config.ConfigValue; // This is just like ConfigDelayedMerge except we know statically // that it will turn out to be an object. -class ConfigDelayedMergeObject extends AbstractConfigObject implements +final class ConfigDelayedMergeObject extends AbstractConfigObject implements Unmergeable { + private static final long serialVersionUID = 1L; + final private List stack; final private boolean ignoresFallbacks; @@ -111,6 +113,31 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements return (ConfigDelayedMergeObject) super.withFallback(mergeable); } + @Override + public ConfigDelayedMergeObject withOnlyKey(String key) { + throw notResolved(); + } + + @Override + public ConfigDelayedMergeObject withoutKey(String key) { + throw notResolved(); + } + + @Override + protected AbstractConfigObject withOnlyPathOrNull(Path path) { + throw notResolved(); + } + + @Override + AbstractConfigObject withOnlyPath(Path path) { + throw notResolved(); + } + + @Override + AbstractConfigObject withoutPath(Path path) { + throw notResolved(); + } + @Override public Collection unmergedValues() { return stack; diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDouble.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigDouble.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigImpl.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigImpl.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigImplUtil.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigImplUtil.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigInt.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigInt.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigLong.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigLong.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigNull.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigNull.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigNumber.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigNumber.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigString.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigString.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ConfigSubstitution.java b/akka-actor/src/main/java/com/typesafe/config/impl/ConfigSubstitution.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/DefaultTransformer.java b/akka-actor/src/main/java/com/typesafe/config/impl/DefaultTransformer.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/FromMapMode.java b/akka-actor/src/main/java/com/typesafe/config/impl/FromMapMode.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/MergeableValue.java b/akka-actor/src/main/java/com/typesafe/config/impl/MergeableValue.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/OriginType.java b/akka-actor/src/main/java/com/typesafe/config/impl/OriginType.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Parseable.java b/akka-actor/src/main/java/com/typesafe/config/impl/Parseable.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Parser.java b/akka-actor/src/main/java/com/typesafe/config/impl/Parser.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Path.java b/akka-actor/src/main/java/com/typesafe/config/impl/Path.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/PathBuilder.java b/akka-actor/src/main/java/com/typesafe/config/impl/PathBuilder.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/PropertiesParser.java b/akka-actor/src/main/java/com/typesafe/config/impl/PropertiesParser.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/ResolveStatus.java b/akka-actor/src/main/java/com/typesafe/config/impl/ResolveStatus.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfig.java b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfig.java old mode 100644 new mode 100755 index daa9f4c368..0ab776b9af --- a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfig.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfig.java @@ -826,4 +826,16 @@ final class SimpleConfig implements Config, MergeableValue, Serializable { throw new ConfigException.ValidationFailed(problems); } } + + @Override + public SimpleConfig withOnlyPath(String pathExpression) { + Path path = Path.newPath(pathExpression); + return new SimpleConfig(root().withOnlyPath(path)); + } + + @Override + public SimpleConfig withoutPath(String pathExpression) { + Path path = Path.newPath(pathExpression); + return new SimpleConfig(root().withoutPath(path)); + } } diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigList.java b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigList.java old mode 100644 new mode 100755 index 9c31dbf0c1..50d361f35e --- a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigList.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigList.java @@ -18,6 +18,8 @@ import com.typesafe.config.ConfigValueType; final class SimpleConfigList extends AbstractConfigValue implements ConfigList { + private static final long serialVersionUID = 1L; + final private List value; final private boolean resolved; diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java old mode 100644 new mode 100755 index c4b8cf461a..a138ec611e --- a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java +++ b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigObject.java @@ -41,6 +41,83 @@ final class SimpleConfigObject extends AbstractConfigObject { this(origin, value, ResolveStatus.fromValues(value.values()), false /* ignoresFallbacks */); } + @Override + public SimpleConfigObject withOnlyKey(String key) { + return withOnlyPath(Path.newKey(key)); + } + + @Override + public SimpleConfigObject withoutKey(String key) { + return withoutPath(Path.newKey(key)); + } + + // gets the object with only the path if the path + // exists, otherwise null if it doesn't. this ensures + // that if we have { a : { b : 42 } } and do + // withOnlyPath("a.b.c") that we don't keep an empty + // "a" object. + @Override + protected SimpleConfigObject withOnlyPathOrNull(Path path) { + String key = path.first(); + Path next = path.remainder(); + AbstractConfigValue v = value.get(key); + + if (next != null) { + if (v != null && (v instanceof AbstractConfigObject)) { + v = ((AbstractConfigObject) v).withOnlyPathOrNull(next); + } else { + // if the path has more elements but we don't have an object, + // then the rest of the path does not exist. + v = null; + } + } + + if (v == null) { + return null; + } else { + return new SimpleConfigObject(origin(), Collections.singletonMap(key, v), + resolveStatus(), ignoresFallbacks); + } + } + + @Override + SimpleConfigObject withOnlyPath(Path path) { + SimpleConfigObject o = withOnlyPathOrNull(path); + if (o == null) { + return new SimpleConfigObject(origin(), + Collections. emptyMap(), resolveStatus(), + ignoresFallbacks); + } else { + return o; + } + } + + @Override + SimpleConfigObject withoutPath(Path path) { + String key = path.first(); + Path next = path.remainder(); + AbstractConfigValue v = value.get(key); + + if (v != null && next != null && v instanceof AbstractConfigObject) { + v = ((AbstractConfigObject) v).withoutPath(next); + Map updated = new HashMap( + value); + updated.put(key, v); + return new SimpleConfigObject(origin(), updated, resolveStatus(), ignoresFallbacks); + } else if (next != null || v == null) { + // can't descend, nothing to remove + return this; + } else { + Map smaller = new HashMap( + value.size() - 1); + for (Map.Entry old : value.entrySet()) { + if (!old.getKey().equals(key)) + smaller.put(old.getKey(), old.getValue()); + } + return new SimpleConfigObject(origin(), smaller, resolveStatus(), ignoresFallbacks); + } + } + @Override protected AbstractConfigValue peek(String key) { return value.get(key); diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigOrigin.java b/akka-actor/src/main/java/com/typesafe/config/impl/SimpleConfigOrigin.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SubstitutionExpression.java b/akka-actor/src/main/java/com/typesafe/config/impl/SubstitutionExpression.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/SubstitutionResolver.java b/akka-actor/src/main/java/com/typesafe/config/impl/SubstitutionResolver.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Token.java b/akka-actor/src/main/java/com/typesafe/config/impl/Token.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/TokenType.java b/akka-actor/src/main/java/com/typesafe/config/impl/TokenType.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Tokenizer.java b/akka-actor/src/main/java/com/typesafe/config/impl/Tokenizer.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Tokens.java b/akka-actor/src/main/java/com/typesafe/config/impl/Tokens.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/impl/Unmergeable.java b/akka-actor/src/main/java/com/typesafe/config/impl/Unmergeable.java old mode 100644 new mode 100755 diff --git a/akka-actor/src/main/java/com/typesafe/config/package.html b/akka-actor/src/main/java/com/typesafe/config/package.html old mode 100644 new mode 100755