/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.xslt.functions; import java.util.Map; import org.elasticsearch.common.collect.Maps; import net.sf.saxon.Configuration; import net.sf.saxon.expr.Expression; import net.sf.saxon.expr.StaticContext; import net.sf.saxon.functions.FunctionLibrary; import net.sf.saxon.functions.FunctionLibraryList; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.trans.XPathException; public class XsltFunctionLibrary implements FunctionLibrary { private final Map<StructuredQName, AbstractXsltFunction> map; public XsltFunctionLibrary() { this.map = Maps.newHashMap(); } protected final void add( final AbstractXsltFunction function ) { this.map.put( function.getName(), function ); for ( final StructuredQName alias : function.getAliases() ) { this.map.put( alias, function ); } } @Override public boolean isAvailable( final StructuredQName name, final int arity ) { final AbstractXsltFunction function = this.map.get( name ); return function != null && function.checkArgCount( arity ); } @Override public Expression bind( final StructuredQName name, final Expression[] args, final StaticContext env ) throws XPathException { final AbstractXsltFunction function = this.map.get( name ); if ( function == null ) { return null; } return function.createCall( args ); } @Override public final FunctionLibrary copy() { final XsltFunctionLibrary lib = new XsltFunctionLibrary(); lib.map.putAll( this.map ); return lib; } private FunctionLibraryList getLibraryList( final Configuration config ) { final FunctionLibrary library = config.getExtensionBinder( "java" ); if (library instanceof FunctionLibraryList) { return (FunctionLibraryList)library; } else { final FunctionLibraryList list = new FunctionLibraryList(); list.addFunctionLibrary( library ); config.setExtensionBinder( "java", list ); return list; } } public void register( final Configuration config ) { getLibraryList(config).addFunctionLibrary( this ); } }