package de.devsurf.injection.guice.configuration;
import java.util.StringTokenizer;
import javax.inject.Inject;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import de.devsurf.injection.guice.jsr330.Names;
public class VariableResolver {
/**
* The symbol that indicates a variable begin.
*/
private static final String VAR_BEGIN = "$";
/**
* The symbol that separates the key name to the default value.
*/
private static final String PIPE_SEPARATOR = "|";
private static final String KEY_PREFIX = "${";
/**
* The Injector instance used to resolve variables.
*/
@Inject
private Injector injector;
public String resolve(final String pattern) {
StringBuilder buffer = new StringBuilder();
int prev = 0;
int pos;
while ((pos = pattern.indexOf(VAR_BEGIN, prev)) >= 0) {
if (pos > 0) {
buffer.append(pattern.substring(prev, pos));
}
if (pos == pattern.length() - 1) {
buffer.append(VAR_BEGIN);
prev = pos + 1;
} else if (pattern.charAt(pos + 1) != '{') {
if (pattern.charAt(pos + 1) == '$') {
buffer.append(VAR_BEGIN);
prev = pos + 2;
} else {
buffer.append(pattern.substring(pos, pos + 2));
prev = pos + 2;
}
} else {
int endName = pattern.indexOf('}', pos);
if (endName < 0) {
throw new IllegalArgumentException("Syntax error in property: " + pattern);
}
StringTokenizer keyTokenizer = new StringTokenizer(pattern.substring(pos + 2, endName), PIPE_SEPARATOR);
String key = keyTokenizer.nextToken().trim();
String defaultValue = null;
if (keyTokenizer.hasMoreTokens()) {
defaultValue = keyTokenizer.nextToken().trim();
}
try {
buffer.append(injector.getInstance(Key.get(String.class, Names.named(key))));
} catch (Throwable e) {
if (defaultValue != null) {
buffer.append(defaultValue);
} else {
buffer.append(KEY_PREFIX).append(key).append('}');
}
}
prev = endName + 1;
}
}
if (prev < pattern.length()) {
buffer.append(pattern.substring(prev));
}
return buffer.toString();
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("variable.1")).to("feuer");
bindConstant().annotatedWith(Names.named("variable.2")).to("frei");
bindConstant().annotatedWith(Names.named("config.soap.protocol")).to("ftp");
bindConstant().annotatedWith(Names.named("config.soap.ip")).to("1.1.1.1");
bindConstant().annotatedWith(Names.named("config.soap.port")).to("9999");
bindConstant().annotatedWith(Names.named("config.soap.app")).to("dynmaic");
bindConstant().annotatedWith(Names.named("config.soap.client")).to("/henkel");
bindConstant().annotatedWith(Names.named("config.soap.stage")).to("test");
}
});
VariableResolver resolver = injector.getInstance(VariableResolver.class);
System.out.println(resolver.resolve("${variable.1} ${variable.2}"));
System.out.println(resolver.resolve("\"${variable.3| }\""));
System.out.println(resolver.resolve("${config.soap.protocol|http}://${config.soap.ip|127.0.0.1}:${config.soap.port|12400}/${config.soap.app|configuration}${config.soap.client| }/soap/optional.xml?stage=${config.soap.stage|default}"));
}
}