/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.xslt.functions;
import java.util.List;
import com.google.common.collect.Lists;
import net.sf.saxon.expr.Expression;
import net.sf.saxon.expr.StaticProperty;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.type.AnyItemType;
import net.sf.saxon.type.ItemType;
import net.sf.saxon.value.SequenceType;
public abstract class AbstractXsltFunction
{
private final StructuredQName name;
private final List<StructuredQName> aliases;
private int minArguments = 0;
private int maxArguments = 0;
private ItemType resultType = AnyItemType.getInstance();
private int resultCardinality = StaticProperty.ALLOWS_ZERO_OR_MORE;
private SequenceType[] argumentTypes;
public AbstractXsltFunction( final String namespacePrefix, final String namespaceUri, final String localName )
{
this.name = new StructuredQName( namespacePrefix, namespaceUri, localName );
this.aliases = Lists.newArrayList();
}
public final StructuredQName getName()
{
return this.name;
}
public final List<StructuredQName> getAliases()
{
return this.aliases;
}
public final boolean checkArgCount( final int numArgs )
{
return ( numArgs == -1 ) || ( numArgs >= this.minArguments && numArgs <= this.maxArguments );
}
protected final void registerAlias( final StructuredQName name )
{
this.aliases.add( name );
}
public final AbstractXsltFunctionCall createCall( final Expression[] args )
throws XPathException
{
final AbstractXsltFunctionCall call = createCall();
call.setFunctionName( this.name );
call.setArguments( args );
call.minArguments = this.minArguments;
call.maxArguments = this.maxArguments;
call.resultType = this.resultType;
call.resultCardinality = this.resultCardinality;
call.argumentTypes = this.argumentTypes;
return call;
}
protected final void setResultType( final SequenceType type )
{
this.resultType = type.getPrimaryType();
this.resultCardinality = type.getCardinality();
}
protected final void setArgumentTypes( final SequenceType... types )
{
this.argumentTypes = types;
this.maxArguments = types.length;
}
protected final void setMinimumNumberOfArguments( final int num )
{
this.minArguments = num;
}
protected final void setMaximumNumberOfArguments( final int args )
{
final SequenceType[] types = new SequenceType[args];
for ( int i = 0; i < types.length; i++ )
{
types[i] = SequenceType.ANY_SEQUENCE;
}
setArgumentTypes( types );
}
protected abstract AbstractXsltFunctionCall createCall();
/*
private final StructuredQName qName;
private int minArgs = 0;
private SequenceType resultType;
private SequenceType[] argTypes = new SequenceType[0];
private final List<ExtensionFunctionDefinition> aliases;
public AbstractXsltFunction( final String namespacePrefix, final String namespaceUri, final String localName )
{
this.qName = new StructuredQName( namespacePrefix, namespaceUri, localName );
this.aliases = Lists.newArrayList();
}
@Override
public final StructuredQName getName()
{
return this.qName;
}
@Override
public final SequenceType[] getArgumentTypes()
{
return this.argTypes;
}
@Override
public final SequenceType getResultType( final SequenceType[] sequenceTypes )
{
return this.resultType;
}
protected final void setMinimumNumberOfArguments( final int args )
{
this.minArgs = args;
}
protected final void setResultType( final SequenceType resultType )
{
this.resultType = resultType;
}
protected final void setArgumentTypes( final SequenceType... types )
{
this.argTypes = types;
}
@Override
public final int getMinimumNumberOfArguments()
{
return this.minArgs;
}
@Override
public final int getMaximumNumberOfArguments()
{
return this.argTypes.length;
}
protected final void registerAlias( final StructuredQName qName )
{
this.aliases.add( new AliasFunctionWrapper( qName, this ) );
}
public final ExtensionFunctionDefinition[] getAliases()
{
return this.aliases.toArray( new ExtensionFunctionDefinition[this.aliases.size()] );
}
public abstract AbstractXsltFunctionCall makeFunctionCall();
*/
}