package com.delcyon.capo.xml;
import java.util.HashMap;
import java.util.Set;
import java.util.logging.Level;
import javax.xml.namespace.QName;
import javax.xml.xpath.XPathFunction;
import com.delcyon.capo.CapoApplication;
public class CapoXPathFunctionResolver implements javax.xml.xpath.XPathFunctionResolver
{
private HashMap<String, XPathFunctionProcessor> xpathFunctionProcessorHashMap = null;
public CapoXPathFunctionResolver()
{
this.xpathFunctionProcessorHashMap = new HashMap<String, XPathFunctionProcessor>();
if (CapoApplication.getAnnotationMap() != null)
{
Set<String> xPathFunctionProviderSet = CapoApplication.getAnnotationMap().get(XPathFunctionProvider.class.getCanonicalName());
for (String className : xPathFunctionProviderSet)
{
try
{
Object object = Class.forName(className).newInstance();
XPathFunctionProcessor xPathFunctionProcessor = (XPathFunctionProcessor) object;
String[] functionNames = xPathFunctionProcessor.getXPathFunctionNames();
for (String functionName : functionNames)
{
xpathFunctionProcessorHashMap.put(functionName, xPathFunctionProcessor);
CapoApplication.logger.log(Level.CONFIG, "Loaded XPathFunctionProcessor "+functionName+"() from "+xPathFunctionProcessor.getClass().getSimpleName());
}
} catch (Exception e)
{
CapoApplication.logger.log(Level.WARNING, "Couldn't load "+className+" as an XPathFunctionProcessor", e);
}
}
}
}
public XPathFunction resolveFunction(QName functionName, int arity)
{
if (xpathFunctionProcessorHashMap.containsKey(functionName.getLocalPart()))
{
return new CapoXPathFunction(functionName.getLocalPart(),xpathFunctionProcessorHashMap.get(functionName.getLocalPart()));
}
return null;
}
}