package com.impossibl.stencil.ext.std;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.google.common.collect.ImmutableMap;
import com.impossibl.stencil.api.GlobalScope;
import com.impossibl.stencil.api.Named;
import com.impossibl.stencil.engine.StencilEngine;
public class StandardGlobals implements GlobalScope {
private static final Logger logger = LogManager.getLogger(StandardGlobals.class);
private static Map<String, ?> globals = getGlobals();
public StandardGlobals() {
logger.info("Initializing Standard Globals");
}
@Override
public Object get(String name) {
Object val = globals.get(name);
if(val == null) {
val = getType(name);
if(val == null) {
return NOT_FOUND;
}
}
return val;
}
private static Map<String,?> getGlobals() {
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
add(builder, new JoinFunction());
add(builder, new RawFunction());
add(builder, new AttrsFunction());
return builder.build();
}
private static void add(ImmutableMap.Builder<String, Object> builder, Object func) {
Named named = func.getClass().getAnnotation(Named.class);
if(named != null) {
logger.info("Adding Extension Function: {} ({})", named.value(), func.getClass().getName());
builder.put(named.value(), func);
}
else {
logger.warn("Extension Function '{}' is missing @Named annotation", func.getClass().getName());
}
}
private static Class<?> getType(String typeName) {
try {
return StencilEngine.class.getClassLoader().loadClass(typeName);
}
catch (ClassNotFoundException e) {
return null;
}
}
}