blob: 308701e47cae7c21bc5fe9c64819b18980695ab5 [file] [log] [blame]
/*
* Copyright 2005 Sascha Weinreuter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.lang.xpath.context.functions;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.Pair;
import org.intellij.lang.xpath.context.ContextType;
import org.intellij.lang.xpath.context.XPathVersion;
import org.intellij.lang.xpath.psi.XPathType;
import javax.xml.namespace.QName;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class DefaultFunctionContext extends AbstractFunctionContext {
private static final Map<Pair<QName, Integer>, Function> DEFAULT_FUNCTIONS_V1;
private static final Map<Pair<QName, Integer>, Function> DEFAULT_FUNCTIONS_V2;
public DefaultFunctionContext(ContextType contextType) {
super(contextType);
}
static {
// XPath 1.0
final Map<Pair<QName, Integer>, Function> decls1 = new HashMap<Pair<QName, Integer>, Function>();
addFunction(decls1, new FunctionImpl("last", XPathType.NUMBER));
addFunction(decls1, new FunctionImpl("position", XPathType.NUMBER));
addFunction(decls1, new FunctionImpl("count", XPathType.NUMBER,
new Parameter(XPathType.NODESET, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("id", XPathType.NODESET,
new Parameter(XPathType.ANY, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("local-name", XPathType.STRING,
new Parameter(XPathType.NODESET, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("namespace-uri", XPathType.STRING,
new Parameter(XPathType.NODESET, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("name", XPathType.STRING,
new Parameter(XPathType.NODESET, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("string", XPathType.STRING,
new Parameter(XPathType.ANY, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("concat", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.VARARG)));
addFunction(decls1, new FunctionImpl("starts-with", XPathType.BOOLEAN,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("contains", XPathType.BOOLEAN,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("substring-before", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("substring-after", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("substring", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.NUMBER, Parameter.Kind.REQUIRED),
new Parameter(XPathType.NUMBER, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("string-length", XPathType.NUMBER,
new Parameter(XPathType.STRING, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("normalize-space", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("translate", XPathType.STRING,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED),
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("boolean", XPathType.BOOLEAN,
new Parameter(XPathType.ANY, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("not", XPathType.BOOLEAN,
new Parameter(XPathType.BOOLEAN, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("true", XPathType.BOOLEAN));
addFunction(decls1, new FunctionImpl("false", XPathType.BOOLEAN));
addFunction(decls1, new FunctionImpl("lang", XPathType.BOOLEAN,
new Parameter(XPathType.STRING, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("number", XPathType.NUMBER,
new Parameter(XPathType.ANY, Parameter.Kind.OPTIONAL)));
addFunction(decls1, new FunctionImpl("sum", XPathType.NUMBER,
new Parameter(XPathType.NODESET, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("floor", XPathType.NUMBER,
new Parameter(XPathType.NUMBER, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("ceiling", XPathType.NUMBER,
new Parameter(XPathType.NUMBER, Parameter.Kind.REQUIRED)));
addFunction(decls1, new FunctionImpl("round", XPathType.NUMBER,
new Parameter(XPathType.NUMBER, Parameter.Kind.REQUIRED)));
// XSLT 1.0
addFunction(decls1, new FunctionImpl("document", XPathType.NODESET,
new Parameter(XPathType.ANY, Parameter.Kind.REQUIRED),
new Parameter(XPathType.NODESET, Parameter.Kind.OPTIONAL)));
DEFAULT_FUNCTIONS_V1 = Collections.unmodifiableMap(decls1);
// XPath 2.0
final Map<Pair<QName, Integer>, Function> decls2 = new HashMap<Pair<QName, Integer>, Function>();
addFunction(decls2, "fn:base-uri() as xs:anyURI?");
addFunction(decls2, "fn:base-uri($arg as node()?) as xs:anyURI?");
addFunction(decls2, "fn:node-name($arg as node()?) as xs:QName?");
addFunction(decls2, "fn:nilled($arg as node()?) as xs:boolean?");
addFunction(decls2, "fn:string() as xs:string");
addFunction(decls2, "fn:string($arg as item()?) as xs:string");
addFunction(decls2, "fn:data($arg as item()*) as xs:anyAtomicType* ");
addFunction(decls2, "fn:document-uri($arg as node()?) as xs:anyURI? ");
addFunction(decls2, "fn:abs($arg as numeric?) as numeric? ");
addFunction(decls2, "fn:ceiling($arg as numeric?) as numeric? ");
addFunction(decls2, "fn:floor($arg as numeric?) as numeric? ");
addFunction(decls2, "fn:round($arg as numeric?) as numeric?");
addFunction(decls2, "fn:round-half-to-even($arg as numeric?) as numeric? ");
addFunction(decls2, "fn:round-half-to-even($arg as numeric?, $precision as xs:integer) as numeric?");
addFunction(decls2, "fn:error() as none");
addFunction(decls2, "fn:error($error as xs:QName) as none");
addFunction(decls2, "fn:error($error as xs:QName?, $description as xs:string) as none");
addFunction(decls2, "fn:error($error as xs:QName?, $description as xs:string, $error-object as item()*) as none ");
addFunction(decls2, "fn:codepoints-to-string($arg as xs:integer*) as xs:string");
addFunction(decls2, "fn:string-to-codepoints($arg as xs:string?) as xs:integer* ");
addFunction(decls2, "fn:trace($value as item()*, $label as xs:string) as item()*");
addFunction(decls2, "fn:dateTime($arg1 as xs:date?, $arg2 as xs:time?) as xs:dateTime?");
addFunction(decls2, "fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:integer?");
addFunction(decls2, "fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?, $collation as xs:string) as xs:integer? ");
addFunction(decls2, "fn:codepoint-equal($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:boolean?");
addFunction(decls2, "fn:concat($arg1 as xs:anyAtomicType?, $arg2 as xs:anyAtomicType?, ...) as xs:string ");
addFunction(decls2, "fn:string-join($arg1 as xs:string*, $arg2 as xs:string) as xs:string");
addFunction(decls2, "fn:substring($sourceString as xs:string?, $startingLoc as xs:double) as xs:string");
addFunction(decls2, "fn:substring($sourceString as xs:string?, $startingLoc as xs:double, $length as xs:double) as xs:string");
addFunction(decls2, "fn:string-length() as xs:integer");
addFunction(decls2, "fn:string-length($arg as xs:string?) as xs:integer");
addFunction(decls2, "fn:normalize-space() as xs:string");
addFunction(decls2, "fn:normalize-space($arg as xs:string?) as xs:string ");
addFunction(decls2, "fn:normalize-unicode($arg as xs:string?) as xs:string ");
addFunction(decls2, "fn:normalize-unicode($arg as xs:string?, $normalizationForm as xs:string) as xs:string");
addFunction(decls2, "fn:upper-case($arg as xs:string?) as xs:string");
addFunction(decls2, "fn:lower-case($arg as xs:string?) as xs:string");
addFunction(decls2, "fn:translate($arg as xs:string?, $mapString as xs:string, $transString as xs:string) as xs:string");
addFunction(decls2, "fn:encode-for-uri($uri-part as xs:string?) as xs:string");
addFunction(decls2, "fn:iri-to-uri($iri as xs:string?) as xs:string");
addFunction(decls2, "fn:escape-html-uri($uri as xs:string?) as xs:string ");
addFunction(decls2, "fn:contains($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean");
addFunction(decls2, "fn:contains($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean");
addFunction(decls2, "fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean ");
addFunction(decls2, "fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean ");
addFunction(decls2, "fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean ");
addFunction(decls2, "fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:boolean");
addFunction(decls2, "fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?) as xs:string");
addFunction(decls2, "fn:substring-before($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string");
addFunction(decls2, "fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?) as xs:string ");
addFunction(decls2, "fn:substring-after($arg1 as xs:string?, $arg2 as xs:string?, $collation as xs:string) as xs:string ");
addFunction(decls2, "fn:matches($input as xs:string?, $pattern as xs:string) as xs:boolean");
addFunction(decls2, "fn:matches($input as xs:string?, $pattern as xs:string, $flags as xs:string) as xs:boolean");
addFunction(decls2, "fn:replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string) as xs:string");
addFunction(decls2, "fn:replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string, $flags as xs:string) as xs:string");
addFunction(decls2, "fn:tokenize($input as xs:string?, $pattern as xs:string) as xs:string* ");
addFunction(decls2, "fn:tokenize($input as xs:string?, $pattern as xs:string, $flags as xs:string) as xs:string* ");
addFunction(decls2, "fn:resolve-uri($relative as xs:string?) as xs:anyURI? ");
addFunction(decls2, "fn:resolve-uri($relative as xs:string?, $base as xs:string) as xs:anyURI?");
addFunction(decls2, "fn:adjust-dateTime-to-timezone($arg as xs:dateTime?) as xs:dateTime?");
addFunction(decls2, "fn:adjust-dateTime-to-timezone($arg as xs:dateTime?, $timezone as xs:dayTimeDuration?) as xs:dateTime?");
addFunction(decls2, "fn:adjust-date-to-timezone($arg as xs:date?) as xs:date? ");
addFunction(decls2, "fn:adjust-date-to-timezone($arg as xs:date?, $timezone as xs:dayTimeDuration?) as xs:date? ");
addFunction(decls2, "fn:adjust-time-to-timezone($arg as xs:time?) as xs:time? ");
addFunction(decls2, "fn:adjust-time-to-timezone($arg as xs:time?, $timezone as xs:dayTimeDuration?) as xs:time?");
addFunction(decls2, "fn:true() as xs:boolean");
addFunction(decls2, "fn:false() as xs:boolean");
addFunction(decls2, "fn:not($arg as item()*) as xs:boolean");
addFunction(decls2, "fn:years-from-duration($arg as xs:duration?) as xs:integer?");
addFunction(decls2, "fn:months-from-duration($arg as xs:duration?) as xs:integer?");
addFunction(decls2, "fn:days-from-duration($arg as xs:duration?) as xs:integer?");
addFunction(decls2, "fn:hours-from-duration($arg as xs:duration?) as xs:integer?");
addFunction(decls2, "fn:minutes-from-duration($arg as xs:duration?) as xs:integer? ");
addFunction(decls2, "fn:seconds-from-duration($arg as xs:duration?) as xs:decimal? ");
addFunction(decls2, "fn:year-from-dateTime($arg as xs:dateTime?) as xs:integer?");
addFunction(decls2, "fn:month-from-dateTime($arg as xs:dateTime?) as xs:integer? ");
addFunction(decls2, "fn:day-from-dateTime($arg as xs:dateTime?) as xs:integer? ");
addFunction(decls2, "fn:hours-from-dateTime($arg as xs:dateTime?) as xs:integer? ");
addFunction(decls2, "fn:minutes-from-dateTime($arg as xs:dateTime?) as xs:integer? ");
addFunction(decls2, "fn:seconds-from-dateTime($arg as xs:dateTime?) as xs:decimal?");
addFunction(decls2, "fn:timezone-from-dateTime($arg as xs:dateTime?) as xs:dayTimeDuration?");
addFunction(decls2, "fn:year-from-date($arg as xs:date?) as xs:integer? ");
addFunction(decls2, "fn:month-from-date($arg as xs:date?) as xs:integer?");
addFunction(decls2, "fn:day-from-date($arg as xs:date?) as xs:integer?");
addFunction(decls2, "fn:timezone-from-date($arg as xs:date?) as xs:dayTimeDuration? ");
addFunction(decls2, "fn:hours-from-time($arg as xs:time?) as xs:integer? ");
addFunction(decls2, "fn:minutes-from-time($arg as xs:time?) as xs:integer? ");
addFunction(decls2, "fn:seconds-from-time($arg as xs:time?) as xs:decimal? ");
addFunction(decls2, "fn:timezone-from-time($arg as xs:time?) as xs:dayTimeDuration? ");
addFunction(decls2, "fn:resolve-QName($qname as xs:string?, $element as element()) as xs:QName?");
addFunction(decls2, "fn:QName($paramURI as xs:string?, $paramQName as xs:string) as xs:QName");
addFunction(decls2, "fn:prefix-from-QName($arg as xs:QName?) as xs:NCName? ");
addFunction(decls2, "fn:local-name-from-QName($arg as xs:QName?) as xs:NCName? ");
addFunction(decls2, "fn:namespace-uri-from-QName($arg as xs:QName?) as xs:anyURI? ");
addFunction(decls2, "fn:namespace-uri-for-prefix($prefix as xs:string?, $element as element()) as xs:anyURI?");
addFunction(decls2, "fn:in-scope-prefixes($element as element()) as xs:string* ");
addFunction(decls2, "fn:name() as xs:string ");
addFunction(decls2, "fn:name($arg as node()?) as xs:string ");
addFunction(decls2, "fn:local-name() as xs:string ");
addFunction(decls2, "fn:local-name($arg as node()?) as xs:string");
addFunction(decls2, "fn:namespace-uri() as xs:anyURI ");
addFunction(decls2, "fn:namespace-uri($arg as node()?) as xs:anyURI");
addFunction(decls2, "fn:number() as xs:double");
addFunction(decls2, "fn:number($arg as xs:anyAtomicType?) as xs:double");
addFunction(decls2, "fn:lang($testlang as xs:string?) as xs:boolean ");
addFunction(decls2, "fn:lang($testlang as xs:string?, $node as node()) as xs:boolean");
addFunction(decls2, "fn:root() as node() ");
addFunction(decls2, "fn:root($arg as node()?) as node()? ");
addFunction(decls2, "fn:boolean($arg as item()*) as xs:boolean ");
addFunction(decls2, "fn:index-of($seqParam as xs:anyAtomicType*, $srchParam as xs:anyAtomicType) as xs:integer*");
addFunction(decls2, "fn:index-of($seqParam as xs:anyAtomicType*, $srchParam as xs:anyAtomicType, $collation as xs:string) as xs:integer*");
addFunction(decls2, "fn:empty($arg as item()*) as xs:boolean ");
addFunction(decls2, "fn:exists($arg as item()*) as xs:boolean");
addFunction(decls2, "fn:distinct-values($arg as xs:anyAtomicType*) as xs:anyAtomicType*");
addFunction(decls2, "fn:distinct-values($arg as xs:anyAtomicType*, $collation as xs:string) as xs:anyAtomicType*");
addFunction(decls2, "fn:insert-before($target as item()*, $position as xs:integer, $inserts as item()*) as item()*");
addFunction(decls2, "fn:remove($target as item()*, $position as xs:integer) as item()*");
addFunction(decls2, "fn:reverse($arg as item()*) as item()*");
addFunction(decls2, "fn:subsequence($sourceSeq as item()*, $startingLoc as xs:double) as item()*");
addFunction(decls2, "fn:subsequence($sourceSeq as item()*, $startingLoc as xs:double, $length as xs:double) as item()*");
addFunction(decls2, "fn:unordered($sourceSeq as item()*) as item()*");
addFunction(decls2, "fn:zero-or-one($arg as item()*) as item()?");
addFunction(decls2, "fn:one-or-more($arg as item()*) as item()+");
addFunction(decls2, "fn:exactly-one($arg as item()*) as item()");
addFunction(decls2, "fn:deep-equal($parameter1 as item()*, $parameter2 as item()*) as xs:boolean");
addFunction(decls2, "fn:deep-equal($parameter1 as item()*, $parameter2 as item()*, $collation as string) as xs:boolean");
addFunction(decls2, "fn:count($arg as item()*) as xs:integer");
addFunction(decls2, "fn:avg($arg as xs:anyAtomicType*) as xs:anyAtomicType? ");
addFunction(decls2, "fn:max($arg as xs:anyAtomicType*) as xs:anyAtomicType?");
addFunction(decls2, "fn:max($arg as xs:anyAtomicType*, $collation as string) as xs:anyAtomicType? ");
addFunction(decls2, "fn:min($arg as xs:anyAtomicType*) as xs:anyAtomicType?");
addFunction(decls2, "fn:min($arg as xs:anyAtomicType*, $collation as string) as xs:anyAtomicType?");
addFunction(decls2, "fn:sum($arg as xs:anyAtomicType*) as xs:anyAtomicType ");
addFunction(decls2, "fn:sum($arg as xs:anyAtomicType*, $zero as xs:anyAtomicType?) as xs:anyAtomicType? ");
addFunction(decls2, "fn:id($arg as xs:string*) as element()*");
addFunction(decls2, "fn:id($arg as xs:string*, $node as node()) as element()*");
addFunction(decls2, "fn:idref($arg as xs:string*) as node()*");
addFunction(decls2, "fn:idref($arg as xs:string*, $node as node()) as node()* ");
addFunction(decls2, "fn:doc($uri as xs:string?) as document-node()?");
addFunction(decls2, "fn:doc-available($uri as xs:string?) as xs:boolean ");
addFunction(decls2, "fn:collection() as node()*");
addFunction(decls2, "fn:collection($arg as xs:string?) as node()*");
addFunction(decls2, "fn:element-with-id($arg as xs:string*) as element()*");
addFunction(decls2, "fn:element-with-id($arg as xs:string*, $node as node()) as element()* ");
addFunction(decls2, "fn:position() as xs:integer");
addFunction(decls2, "fn:last() as xs:integer");
addFunction(decls2, "fn:current-dateTime() as xs:dateTime");
addFunction(decls2, "fn:current-date() as xs:date");
addFunction(decls2, "fn:current-time() as xs:time ");
addFunction(decls2, "fn:implicit-timezone() as xs:dayTimeDuration");
addFunction(decls2, "fn:default-collation() as xs:string");
addFunction(decls2, "fn:static-base-uri() as xs:anyURI? ");
// constructor functions
addFunction(decls2, "xs:string($arg as xs:anyAtomicType?) as xs:string?");
addFunction(decls2, "xs:date($arg as xs:anyAtomicType?) as xs:date?");
addFunction(decls2, "xs:boolean($arg as xs:anyAtomicType?) as xs:boolean?");
addFunction(decls2, "xs:decimal($arg as xs:anyAtomicType?) as xs:decimal?");
addFunction(decls2, "xs:float($arg as xs:anyAtomicType?) as xs:float?");
addFunction(decls2, "xs:double($arg as xs:anyAtomicType?) as xs:double?");
addFunction(decls2, "xs:duration($arg as xs:anyAtomicType?) as xs:duration?");
addFunction(decls2, "xs:dateTime($arg as xs:anyAtomicType?) as xs:dateTime?");
addFunction(decls2, "xs:time($arg as xs:anyAtomicType?) as xs:time?");
addFunction(decls2, "xs:gYearMonth($arg as xs:anyAtomicType?) as xs:gYearMonth?");
addFunction(decls2, "xs:gYear($arg as xs:anyAtomicType?) as xs:gYear?");
addFunction(decls2, "xs:gMonthDay($arg as xs:anyAtomicType?) as xs:gMonthDay?");
addFunction(decls2, "xs:gDay($arg as xs:anyAtomicType?) as xs:gDay?");
addFunction(decls2, "xs:gMonth($arg as xs:anyAtomicType?) as xs:gMonth?");
addFunction(decls2, "xs:hexBinary($arg as xs:anyAtomicType?) as xs:hexBinary?");
addFunction(decls2, "xs:base64Binary($arg as xs:anyAtomicType?) as xs:base64Binary?");
addFunction(decls2, "xs:anyURI($arg as xs:anyAtomicType?) as xs:anyURI?");
addFunction(decls2, "xs:QName($arg as xs:anyAtomicType) as xs:QName?");
addFunction(decls2, "xs:normalizedString($arg as xs:anyAtomicType?) as xs:normalizedString?");
addFunction(decls2, "xs:token($arg as xs:anyAtomicType?) as xs:token?");
addFunction(decls2, "xs:language($arg as xs:anyAtomicType?) as xs:language?");
addFunction(decls2, "xs:NMTOKEN($arg as xs:anyAtomicType?) as xs:NMTOKEN?");
addFunction(decls2, "xs:Name($arg as xs:anyAtomicType?) as xs:Name?");
addFunction(decls2, "xs:NCName($arg as xs:anyAtomicType?) as xs:NCName?");
addFunction(decls2, "xs:ID($arg as xs:anyAtomicType?) as xs:ID?");
addFunction(decls2, "xs:IDREF($arg as xs:anyAtomicType?) as xs:IDREF?");
addFunction(decls2, "xs:ENTITY($arg as xs:anyAtomicType?) as xs:ENTITY?");
addFunction(decls2, "xs:integer($arg as xs:anyAtomicType?) as xs:integer?");
addFunction(decls2, "xs:nonPositiveInteger($arg as xs:anyAtomicType?) as xs:nonPositiveInteger?");
addFunction(decls2, "xs:negativeInteger($arg as xs:anyAtomicType?) as xs:negativeInteger?");
addFunction(decls2, "xs:long($arg as xs:anyAtomicType?) as xs:long?");
addFunction(decls2, "xs:int($arg as xs:anyAtomicType?) as xs:int?");
addFunction(decls2, "xs:short($arg as xs:anyAtomicType?) as xs:short?");
addFunction(decls2, "xs:byte($arg as xs:anyAtomicType?) as xs:byte?");
addFunction(decls2, "xs:nonNegativeInteger($arg as xs:anyAtomicType?) as xs:nonNegativeInteger?");
addFunction(decls2, "xs:unsignedLong($arg as xs:anyAtomicType?) as xs:unsignedLong?");
addFunction(decls2, "xs:unsignedInt($arg as xs:anyAtomicType?) as xs:unsignedInt?");
addFunction(decls2, "xs:unsignedShort($arg as xs:anyAtomicType?) as xs:unsignedShort?");
addFunction(decls2, "xs:unsignedByte($arg as xs:anyAtomicType?) as xs:unsignedByte?");
addFunction(decls2, "xs:positiveInteger($arg as xs:anyAtomicType?) as xs:positiveInteger?");
addFunction(decls2, "xs:yearMonthDuration($arg as xs:anyAtomicType?) as xs:yearMonthDuration?");
addFunction(decls2, "xs:dayTimeDuration($arg as xs:anyAtomicType?) as xs:dayTimeDuration?");
addFunction(decls2, "xs:untypedAtomic($arg as xs:anyAtomicType?) as xs:untypedAtomic?");
DEFAULT_FUNCTIONS_V2 = Collections.unmodifiableMap(decls2);
}
@Override
protected Map<Pair<QName, Integer>, Function> createFunctionMap(ContextType type) {
final XPathVersion version = type.getVersion();
if (version == XPathVersion.V1) {
return DEFAULT_FUNCTIONS_V1;
} else if (version == XPathVersion.V2) {
return DEFAULT_FUNCTIONS_V2;
} else {
throw new IllegalStateException("Unsupprted version: " + version);
}
}
public static void addFunction(Map<Pair<QName, Integer>, Function> decls, String value) {
FunctionDeclarationParsing.addFunction(decls, value);
}
public static void addFunction(Map<Pair<QName, Integer>, Function> decls, Function value) {
decls.put(Pair.create(new QName(null, value.getName()), value.getParameters().length), value);
}
public static void addFunction(Map<Pair<QName, Integer>, Function> decls, String namespace, Function value) {
decls.put(Pair.create(new QName(namespace, value.getName()), value.getParameters().length), value);
}
public boolean allowsExtensions() {
return false;
}
public static FunctionContext getInstance(final ContextType type) {
return AbstractFunctionContext.getInstance(type, new Factory<FunctionContext>() {
@Override
public FunctionContext create() {
return new DefaultFunctionContext(type);
}
});
}
}