throws Exception
{
// This bugger is public, because we want to run some Unit tests
// on it.
ExtendedProperties veloConfig = new ExtendedProperties();
// Fix up all the template resource loader pathes to be
// webapp relative. Copy all other keys verbatim into the
// veloConfiguration.
for (Iterator i = conf.getKeys(); i.hasNext();)
{
String key = (String) i.next();
if (!key.endsWith(RESOURCE_LOADER_PATH))
{
Object value = conf.getProperty(key);
// Since 1.0-pre-something, Commons Collections suddently
// no longer returns a vector for multiple value-keys but a
// List object. Velocity will choke if we add this object because
// org.apache.commons.collections.ExtendedProperties expect a
// Vector object. Ah, the joys of incompatible class changes,
// unwritten assumptions and general Java JAR Hell... =8-O
if (value instanceof List)
{
List srcValue = (List) value;
Vector targetValue = new Vector(srcValue.size());
for (Iterator it = srcValue.iterator(); it.hasNext(); )
{
targetValue.add(it.next());
}
veloConfig.addProperty(key, targetValue);
}
else
{
veloConfig.addProperty(key, value);
}
continue; // for()
}
List paths = conf.getList(key, null);
if (paths == null)
{
// We don't copy this into VeloProperties, because
// null value is unhealthy for the ExtendedProperties object...
continue; // for()
}
Velocity.clearProperty(key);
// Translate the supplied pathes given here.
// the following three different kinds of
// pathes must be translated to be webapp-relative
//
// jar:file://path-component!/entry-component
// file://path-component
// path/component
for (Iterator j = paths.iterator(); j.hasNext();)
{
String path = (String) j.next();
log.debug("Translating " + path);
if (path.startsWith(JAR_PREFIX))
{
// skip jar: -> 4 chars
if (path.substring(4).startsWith(ABSOLUTE_PREFIX))
{
// We must convert up to the jar path separator
int jarSepIndex = path.indexOf("!/");
// jar:file:// -> skip 11 chars
path = (jarSepIndex < 0)
? Turbine.getRealPath(path.substring(11))
// Add the path after the jar path separator again to the new url.
: (Turbine.getRealPath(path.substring(11, jarSepIndex)) + path.substring(jarSepIndex));
log.debug("Result (absolute jar path): " + path);
}
}
else if(path.startsWith(ABSOLUTE_PREFIX))
{
// skip file:// -> 7 chars
path = Turbine.getRealPath(path.substring(7));
log.debug("Result (absolute URL Path): " + path);
}
// Test if this might be some sort of URL that we haven't encountered yet.
else if(path.indexOf("://") < 0)
{
path = Turbine.getRealPath(path);
log.debug("Result (normal fs reference): " + path);
}
log.debug("Adding " + key + " -> " + path);
// Re-Add this property to the configuration object
veloConfig.addProperty(key, path);
}
}
return veloConfig;
}