package org.apache.commons.configuration;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import java.util.HashMap;
import java.util.Map;
import org.jboss.netty.logging.InternalLogger;
import org.jboss.netty.logging.InternalLoggerFactory;
public class GInterpolator implements Interpolator
{
Binding _binding;
GroovyShell _shell;
Configuration _conf;
Map _cache = null;
String[] _imports = null;
InternalLogger log = InternalLoggerFactory.getInstance(this.getClass().getName());
public GInterpolator(Configuration conf, boolean cache, String[] imports, Map utils)
{
_conf = conf;
_binding = new ConfigurationBinding(conf, utils);
_shell = new GroovyShell(_binding);
setCache(cache);
_imports = imports;
}
public GInterpolator(Configuration conf)
{
this(conf, false, null, null);
}
public void setCache(boolean cache)
{
if (cache)
_cache = new HashMap();
}
public Object interpolate(Object value)
{
if (!(value instanceof String))
return value;
if (_cache != null)
{
Object cachedResult = _cache.get(value);
if (cachedResult != null)
return cachedResult;
}
String result = (String) value;
int i = result.lastIndexOf("${");
while (i != -1)
{
int r = getExpression(result, i + 2);
String expression = result.substring(i + 2, r);
String eval = evaluate(expression);
String p1 = result.substring(0, i);
String p2 = result.substring(r + 1);
result = p1 + eval + p2;
i = result.lastIndexOf("${");
}
if (_cache != null)
_cache.put(value, result);
return result;
}
private int getExpression(String value, int i)
{
int i1 = value.indexOf('{', i);
int i2 = value.indexOf('}', i);
while (i1 != -1 && i2 > i1)
{
i2 = value.indexOf('}', i1);
i1 = value.indexOf('{', i1 + 1);
}
return i2;
}
private String evaluate(String value)
{
String result = null;
Exception caught = null;
try
{
result = (String)_binding.getVariable(value);
}
catch (Exception ex)
{
caught = ex;
try
{
result = _conf.getString(value);
}
catch (Exception ex1)
{
caught = ex1;
}
}
if (result == null)
try
{
if (_imports != null)
for (String im : _imports)
{
value = "import " + im + "\n" + value;
}
result = _shell.evaluate(value).toString();
}
catch (Exception ex)
{
caught = ex;
}
if (result == null)
{
result = "?unresolved?";
if (caught != null)
log.warn("error evaluating "+value, caught);
else
log.warn("error evaluating "+value);
}
return result;
}
public Binding getBinding()
{
return _binding;
}
}