/** * */ package org.xmlsh.core; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.text.StrLookup; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.xmlsh.sh.shell.Shell; import org.xmlsh.util.StringPair; import org.xmlsh.util.Util; import org.xmlsh.xpath.ThreadLocalShell; /** * @author DLEE * */ public abstract class XStringLookup extends StrLookup<String> { private Map<String, XStringLookup> mSchemes; private static Map<String, XStringLookup> sDefaultSchemes = new HashMap<>(); private XStringLookup mParent = null; static Logger mLogger = LogManager.getLogger(); public XStringLookup() { this(null, getDefaultSchemes()); } public XStringLookup(XStringLookup parent, Map<String, XStringLookup> schemes) { super(); mSchemes = schemes; mParent = parent; } public static Map<String, XStringLookup> getDefaultSchemes() { synchronized(sDefaultSchemes) { if(sDefaultSchemes.isEmpty()) { sDefaultSchemes.put("env", new XStringLookup(null, null) { @Override protected XValue lookupXValue(String name) { Shell shell = ThreadLocalShell.get(); if(shell != null) return shell.getEnv().getVarValue(name); return null; } }); sDefaultSchemes.put("date", new XStringLookup(null, null) { @Override protected XValue lookupXValue(String name) { String ds = ""; Date now = new Date(); try { if(Util.isEmpty(name)) ds = SimpleDateFormat.getDateInstance().format(now); else ds = new SimpleDateFormat(name).format(now); } catch (Exception e) { mLogger.catching(e); ds = ""; } if(Util.isEmpty(ds)) ds = (new Date()).toString(); return XValue.newXValue(ds); } }); } } return sDefaultSchemes; } /** * @param defaultSchemes */ public XStringLookup(Map<String, XStringLookup> schemes) { this(null, schemes); } /** * @param parent */ public XStringLookup(XStringLookup parent) { this(parent, getDefaultSchemes()); } protected XStringLookup getScheme(String scheme) { if(mSchemes == null) return null; return mSchemes.get(scheme); } protected abstract XValue lookupXValue(String value) throws InvalidArgumentException, CoreException; protected XValue lookupXValue(String scheme, String name) throws CoreException { XValue value = null; // Scheme specific lookup if(scheme != null) { XStringLookup schemeLookup = getScheme(scheme); if(schemeLookup != null) value = schemeLookup.lookupXValue(name); if(value == null && mParent != null) value = mParent.lookupXValue(scheme, name); return value; } // no scheme value = lookupXValue(name); if(value == null && mParent != null) value = mParent.lookupXValue(name); return value; } @Override public final String lookup(String key) { mLogger.entry(key); StringPair pair = new StringPair(key, ':'); String scheme = pair.getLeft(); String name = pair.getRight(); XValue value = null; try { value = lookupXValue(scheme, name); } catch (CoreException e) { // TODO Auto-generated catch block mLogger.catching(e); } if(value == null) return mLogger.exit(null); // TODO: Better determination of if to convert to string return mLogger.exit(value.toString()); } public static XStringLookup newInstance(XValue def) { return new XStringLookup() { @Override protected XValue lookupXValue(String name) throws CoreException { return def.getNamedValue(name); } }; } }