mirror of
https://github.com/lightbend/config.git
synced 2025-03-29 21:51:10 +08:00
remove pluggable ConfigTransformer
Doesn't seem to have a useful purpose, was a bad idea. Just hardcode the built-in automatic type conversions.
This commit is contained in:
parent
ece196c146
commit
b7a73dc85b
@ -22,14 +22,8 @@ import com.typesafe.config.ConfigValueType;
|
|||||||
|
|
||||||
abstract class AbstractConfigObject extends AbstractConfigValue implements
|
abstract class AbstractConfigObject extends AbstractConfigValue implements
|
||||||
ConfigObject {
|
ConfigObject {
|
||||||
final protected ConfigTransformer transformer;
|
protected AbstractConfigObject(ConfigOrigin origin) {
|
||||||
|
|
||||||
protected AbstractConfigObject(ConfigOrigin origin,
|
|
||||||
ConfigTransformer transformer) {
|
|
||||||
super(origin);
|
super(origin);
|
||||||
this.transformer = transformer;
|
|
||||||
if (transformer == null)
|
|
||||||
throw new ConfigException.BugOrBroken("null transformer");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,34 +122,23 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
return peeked != null && peeked.valueType() != ConfigValueType.NULL;
|
return peeked != null && peeked.valueType() != ConfigValueType.NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected abstract AbstractConfigObject newCopy(ResolveStatus status);
|
||||||
AbstractConfigObject transformed(ConfigTransformer newTransformer) {
|
|
||||||
if (newTransformer != transformer)
|
|
||||||
return newCopy(newTransformer, resolveStatus());
|
|
||||||
else
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract AbstractConfigObject newCopy(
|
|
||||||
ConfigTransformer newTransformer, ResolveStatus status);
|
|
||||||
|
|
||||||
static private AbstractConfigValue resolve(AbstractConfigObject self,
|
static private AbstractConfigValue resolve(AbstractConfigObject self,
|
||||||
String pathExpression,
|
String pathExpression, ConfigValueType expected,
|
||||||
ConfigValueType expected, ConfigTransformer transformer,
|
|
||||||
String originalPath) {
|
String originalPath) {
|
||||||
Path path = Path.newPath(pathExpression);
|
Path path = Path.newPath(pathExpression);
|
||||||
return find(self, path, expected, transformer, originalPath);
|
return find(self, path, expected, originalPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
static private AbstractConfigValue findKey(AbstractConfigObject self,
|
static private AbstractConfigValue findKey(AbstractConfigObject self,
|
||||||
String key, ConfigValueType expected,
|
String key, ConfigValueType expected, String originalPath) {
|
||||||
ConfigTransformer transformer, String originalPath) {
|
|
||||||
AbstractConfigValue v = self.peek(key);
|
AbstractConfigValue v = self.peek(key);
|
||||||
if (v == null)
|
if (v == null)
|
||||||
throw new ConfigException.Missing(originalPath);
|
throw new ConfigException.Missing(originalPath);
|
||||||
|
|
||||||
if (expected != null && transformer != null)
|
if (expected != null)
|
||||||
v = transformer.transform(v, expected);
|
v = DefaultTransformer.transform(v, expected);
|
||||||
|
|
||||||
if (v.valueType() == ConfigValueType.NULL)
|
if (v.valueType() == ConfigValueType.NULL)
|
||||||
throw new ConfigException.Null(v.origin(), originalPath,
|
throw new ConfigException.Null(v.origin(), originalPath,
|
||||||
@ -168,24 +151,24 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
static private AbstractConfigValue find(AbstractConfigObject self,
|
static private AbstractConfigValue find(AbstractConfigObject self,
|
||||||
Path path, ConfigValueType expected, ConfigTransformer transformer,
|
Path path, ConfigValueType expected,
|
||||||
String originalPath) {
|
String originalPath) {
|
||||||
String key = path.first();
|
String key = path.first();
|
||||||
Path next = path.remainder();
|
Path next = path.remainder();
|
||||||
if (next == null) {
|
if (next == null) {
|
||||||
return findKey(self, key, expected, transformer, originalPath);
|
return findKey(self, key, expected, originalPath);
|
||||||
} else {
|
} else {
|
||||||
AbstractConfigObject o = (AbstractConfigObject) findKey(self,
|
AbstractConfigObject o = (AbstractConfigObject) findKey(self, key,
|
||||||
key, ConfigValueType.OBJECT, transformer, originalPath);
|
ConfigValueType.OBJECT, originalPath);
|
||||||
assert (o != null); // missing was supposed to throw
|
assert (o != null); // missing was supposed to throw
|
||||||
return find(o, next, expected, transformer, originalPath);
|
return find(o, next, expected, originalPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractConfigValue find(String pathExpression,
|
AbstractConfigValue find(String pathExpression,
|
||||||
ConfigValueType expected,
|
ConfigValueType expected,
|
||||||
String originalPath) {
|
String originalPath) {
|
||||||
return resolve(this, pathExpression, expected, transformer,
|
return resolve(this, pathExpression, expected,
|
||||||
originalPath);
|
originalPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,7 +294,7 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (changes == null) {
|
if (changes == null) {
|
||||||
return newCopy(transformer, newResolveStatus);
|
return newCopy(newResolveStatus);
|
||||||
} else {
|
} else {
|
||||||
Map<String, AbstractConfigValue> modified = new HashMap<String, AbstractConfigValue>();
|
Map<String, AbstractConfigValue> modified = new HashMap<String, AbstractConfigValue>();
|
||||||
for (String k : keySet()) {
|
for (String k : keySet()) {
|
||||||
@ -321,7 +304,7 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
modified.put(k, peek(k));
|
modified.put(k, peek(k));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new SimpleConfigObject(origin(), transformer, modified,
|
return new SimpleConfigObject(origin(), modified,
|
||||||
newResolveStatus);
|
newResolveStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -411,7 +394,7 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
public AbstractConfigObject getObject(String path) {
|
public AbstractConfigObject getObject(String path) {
|
||||||
AbstractConfigObject obj = (AbstractConfigObject) find(path,
|
AbstractConfigObject obj = (AbstractConfigObject) find(path,
|
||||||
ConfigValueType.OBJECT, path);
|
ConfigValueType.OBJECT, path);
|
||||||
return obj.transformed(this.transformer);
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -460,8 +443,8 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
for (ConfigValue cv : list) {
|
for (ConfigValue cv : list) {
|
||||||
// variance would be nice, but stupid cast will do
|
// variance would be nice, but stupid cast will do
|
||||||
AbstractConfigValue v = (AbstractConfigValue) cv;
|
AbstractConfigValue v = (AbstractConfigValue) cv;
|
||||||
if (expected != null && transformer != null) {
|
if (expected != null) {
|
||||||
v = transformer.transform(v, expected);
|
v = DefaultTransformer.transform(v, expected);
|
||||||
}
|
}
|
||||||
if (v.valueType() != expected)
|
if (v.valueType() != expected)
|
||||||
throw new ConfigException.WrongType(v.origin(), path,
|
throw new ConfigException.WrongType(v.origin(), path,
|
||||||
@ -525,7 +508,7 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
|||||||
if (v.valueType() != ConfigValueType.OBJECT)
|
if (v.valueType() != ConfigValueType.OBJECT)
|
||||||
throw new ConfigException.WrongType(v.origin(), path,
|
throw new ConfigException.WrongType(v.origin(), path,
|
||||||
ConfigValueType.OBJECT.name(), v.valueType().name());
|
ConfigValueType.OBJECT.name(), v.valueType().name());
|
||||||
l.add(((AbstractConfigObject) v).transformed(this.transformer));
|
l.add((ConfigObject) v);
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
@ -73,10 +73,6 @@ abstract class AbstractConfigValue implements ConfigValue {
|
|||||||
return merged;
|
return merged;
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractConfigValue transformed(ConfigTransformer transformer) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean canEqual(Object other) {
|
protected boolean canEqual(Object other) {
|
||||||
return other instanceof ConfigValue;
|
return other instanceof ConfigValue;
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,8 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
|
|||||||
final private List<AbstractConfigValue> stack;
|
final private List<AbstractConfigValue> stack;
|
||||||
|
|
||||||
ConfigDelayedMergeObject(ConfigOrigin origin,
|
ConfigDelayedMergeObject(ConfigOrigin origin,
|
||||||
ConfigTransformer transformer,
|
|
||||||
List<AbstractConfigValue> stack) {
|
List<AbstractConfigValue> stack) {
|
||||||
super(origin, transformer);
|
super(origin);
|
||||||
this.stack = stack;
|
this.stack = stack;
|
||||||
if (stack.isEmpty())
|
if (stack.isEmpty())
|
||||||
throw new ConfigException.BugOrBroken(
|
throw new ConfigException.BugOrBroken(
|
||||||
@ -31,11 +30,6 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
|
|||||||
"created a delayed merge object not guaranteed to be an object");
|
"created a delayed merge object not guaranteed to be an object");
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigDelayedMergeObject(ConfigOrigin origin,
|
|
||||||
List<AbstractConfigValue> stack) {
|
|
||||||
this(origin, ConfigImpl.defaultConfigTransformer(), stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
final private static class Root extends ConfigDelayedMergeObject implements
|
final private static class Root extends ConfigDelayedMergeObject implements
|
||||||
ConfigRootImpl {
|
ConfigRootImpl {
|
||||||
final private Path rootPath;
|
final private Path rootPath;
|
||||||
@ -90,12 +84,11 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConfigDelayedMergeObject newCopy(ConfigTransformer newTransformer,
|
public ConfigDelayedMergeObject newCopy(ResolveStatus status) {
|
||||||
ResolveStatus status) {
|
|
||||||
if (status != resolveStatus())
|
if (status != resolveStatus())
|
||||||
throw new ConfigException.BugOrBroken(
|
throw new ConfigException.BugOrBroken(
|
||||||
"attempt to create resolved ConfigDelayedMergeObject");
|
"attempt to create resolved ConfigDelayedMergeObject");
|
||||||
return new ConfigDelayedMergeObject(origin(), newTransformer, stack);
|
return new ConfigDelayedMergeObject(origin(), stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -123,7 +116,7 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
|
|||||||
for (AbstractConfigValue o : stack) {
|
for (AbstractConfigValue o : stack) {
|
||||||
newStack.add(o.relativized(prefix));
|
newStack.add(o.relativized(prefix));
|
||||||
}
|
}
|
||||||
return new ConfigDelayedMergeObject(origin(), transformer, newStack);
|
return new ConfigDelayedMergeObject(origin(), newStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -254,15 +254,6 @@ public class ConfigImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ConfigTransformer defaultTransformer = null;
|
|
||||||
|
|
||||||
synchronized static ConfigTransformer defaultConfigTransformer() {
|
|
||||||
if (defaultTransformer == null) {
|
|
||||||
defaultTransformer = new DefaultTransformer();
|
|
||||||
}
|
|
||||||
return defaultTransformer;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class SimpleIncluder implements ConfigIncluder {
|
private static class SimpleIncluder implements ConfigIncluder {
|
||||||
|
|
||||||
private ConfigIncluder fallback;
|
private ConfigIncluder fallback;
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
package com.typesafe.config.impl;
|
|
||||||
|
|
||||||
import com.typesafe.config.ConfigValueType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A ConfigTransformer converts values in the config to other values, most often
|
|
||||||
* it's used to parse strings and treat them as some other kind of value.
|
|
||||||
*
|
|
||||||
* This was originally in the public API but I'm now thinking it is not useful
|
|
||||||
* to customize, so it's not public for now. It's still used internally, but
|
|
||||||
* probably the code could be cleaned up by just hard-coding the equivalent of
|
|
||||||
* the DefaultTransformer.
|
|
||||||
*/
|
|
||||||
interface ConfigTransformer {
|
|
||||||
/**
|
|
||||||
* Because this interface is currently private, it uses AbstractConfigValue;
|
|
||||||
* if public it would have to use plain ConfigValue.
|
|
||||||
*
|
|
||||||
* @param value
|
|
||||||
* the value to potentially transform
|
|
||||||
* @param requested
|
|
||||||
* the target type to transform to
|
|
||||||
* @return a new value or the original value
|
|
||||||
*/
|
|
||||||
AbstractConfigValue transform(AbstractConfigValue value,
|
|
||||||
ConfigValueType requested);
|
|
||||||
}
|
|
@ -5,10 +5,9 @@ import com.typesafe.config.ConfigValueType;
|
|||||||
/**
|
/**
|
||||||
* Default automatic type transformations.
|
* Default automatic type transformations.
|
||||||
*/
|
*/
|
||||||
final class DefaultTransformer implements ConfigTransformer {
|
final class DefaultTransformer {
|
||||||
|
|
||||||
@Override
|
static AbstractConfigValue transform(AbstractConfigValue value,
|
||||||
public AbstractConfigValue transform(AbstractConfigValue value,
|
|
||||||
ConfigValueType requested) {
|
ConfigValueType requested) {
|
||||||
if (value.valueType() == ConfigValueType.STRING) {
|
if (value.valueType() == ConfigValueType.STRING) {
|
||||||
String s = (String) value.unwrapped();
|
String s = (String) value.unwrapped();
|
||||||
|
@ -9,20 +9,18 @@ import com.typesafe.config.ConfigValue;
|
|||||||
abstract class DelegatingConfigObject extends AbstractConfigObject {
|
abstract class DelegatingConfigObject extends AbstractConfigObject {
|
||||||
final private AbstractConfigObject underlying;
|
final private AbstractConfigObject underlying;
|
||||||
|
|
||||||
DelegatingConfigObject(ConfigTransformer transformer,
|
DelegatingConfigObject(AbstractConfigObject underlying) {
|
||||||
AbstractConfigObject underlying) {
|
super(underlying.origin());
|
||||||
super(underlying.origin(), transformer);
|
|
||||||
this.underlying = underlying;
|
this.underlying = underlying;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DelegatingConfigObject newCopy(ConfigTransformer newTransformer,
|
protected DelegatingConfigObject newCopy(ResolveStatus newStatus) {
|
||||||
ResolveStatus newStatus) {
|
return newCopy(underlying, newStatus);
|
||||||
return newCopy(underlying, newTransformer, newStatus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract DelegatingConfigObject newCopy(AbstractConfigObject underlying,
|
abstract DelegatingConfigObject newCopy(AbstractConfigObject underlying,
|
||||||
ConfigTransformer newTransformer, ResolveStatus newStatus);
|
ResolveStatus newStatus);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
ResolveStatus resolveStatus() {
|
ResolveStatus resolveStatus() {
|
||||||
|
@ -9,7 +9,7 @@ final class RootConfigObject extends DelegatingConfigObject implements
|
|||||||
final private Path rootPath;
|
final private Path rootPath;
|
||||||
|
|
||||||
RootConfigObject(AbstractConfigObject underlying, Path rootPath) {
|
RootConfigObject(AbstractConfigObject underlying, Path rootPath) {
|
||||||
super(underlying.transformer, underlying);
|
super(underlying);
|
||||||
this.rootPath = rootPath;
|
this.rootPath = rootPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,9 +24,8 @@ final class RootConfigObject extends DelegatingConfigObject implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RootConfigObject newCopy(AbstractConfigObject underlying,
|
public RootConfigObject newCopy(AbstractConfigObject underlying,
|
||||||
ConfigTransformer newTransformer, ResolveStatus newStatus) {
|
ResolveStatus newStatus) {
|
||||||
return new RootConfigObject(underlying.newCopy(newTransformer,
|
return new RootConfigObject(underlying.newCopy(newStatus), rootPath);
|
||||||
newStatus), rootPath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -18,9 +18,9 @@ final class SimpleConfigObject extends AbstractConfigObject {
|
|||||||
final private Map<String, AbstractConfigValue> value;
|
final private Map<String, AbstractConfigValue> value;
|
||||||
final private boolean resolved;
|
final private boolean resolved;
|
||||||
|
|
||||||
SimpleConfigObject(ConfigOrigin origin, ConfigTransformer transformer,
|
SimpleConfigObject(ConfigOrigin origin,
|
||||||
Map<String, AbstractConfigValue> value, ResolveStatus status) {
|
Map<String, AbstractConfigValue> value, ResolveStatus status) {
|
||||||
super(origin, transformer);
|
super(origin);
|
||||||
if (value == null)
|
if (value == null)
|
||||||
throw new ConfigException.BugOrBroken(
|
throw new ConfigException.BugOrBroken(
|
||||||
"creating config object with null map");
|
"creating config object with null map");
|
||||||
@ -28,31 +28,20 @@ final class SimpleConfigObject extends AbstractConfigObject {
|
|||||||
this.resolved = status == ResolveStatus.RESOLVED;
|
this.resolved = status == ResolveStatus.RESOLVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SimpleConfigObject(ConfigOrigin origin, ConfigTransformer transformer,
|
SimpleConfigObject(ConfigOrigin origin,
|
||||||
Map<String, AbstractConfigValue> value) {
|
Map<String, AbstractConfigValue> value) {
|
||||||
this(origin, transformer, value, ResolveStatus.fromValues(value
|
this(origin, value, ResolveStatus.fromValues(value
|
||||||
.values()));
|
.values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SimpleConfigObject(ConfigOrigin origin,
|
|
||||||
Map<String, AbstractConfigValue> value, ResolveStatus status) {
|
|
||||||
this(origin, ConfigImpl.defaultConfigTransformer(), value, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
SimpleConfigObject(ConfigOrigin origin,
|
|
||||||
Map<String, AbstractConfigValue> value) {
|
|
||||||
this(origin, value, ResolveStatus.fromValues(value.values()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AbstractConfigValue peek(String key) {
|
protected AbstractConfigValue peek(String key) {
|
||||||
return value.get(key);
|
return value.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SimpleConfigObject newCopy(ConfigTransformer newTransformer,
|
public SimpleConfigObject newCopy(ResolveStatus newStatus) {
|
||||||
ResolveStatus newStatus) {
|
return new SimpleConfigObject(origin(), value,
|
||||||
return new SimpleConfigObject(origin(), newTransformer, value,
|
|
||||||
newStatus);
|
newStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
package com.typesafe.config.impl;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.typesafe.config.ConfigValueType;
|
|
||||||
|
|
||||||
final class StackTransformer implements ConfigTransformer {
|
|
||||||
|
|
||||||
final private List<ConfigTransformer> stack;
|
|
||||||
|
|
||||||
StackTransformer(List<ConfigTransformer> stack) {
|
|
||||||
this.stack = stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AbstractConfigValue transform(AbstractConfigValue value,
|
|
||||||
ConfigValueType requested) {
|
|
||||||
AbstractConfigValue current = value;
|
|
||||||
for (ConfigTransformer t : stack) {
|
|
||||||
current = t.transform(current, requested);
|
|
||||||
}
|
|
||||||
return current;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user