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