package client.net.sf.saxon.ce.type; import client.net.sf.saxon.ce.Configuration; import client.net.sf.saxon.ce.om.Item; import client.net.sf.saxon.ce.om.NamePool; /** * ItemType is an interface that allows testing of whether an Item conforms to an * expected type. ItemType represents the types in the type hierarchy in the XPath model, * as distinct from the schema model: an item type is either item() (matches everything), * a node type (matches nodes), an atomic type (matches atomic values), or empty() * (matches nothing). Atomic types, represented by the class AtomicType, are also * instances of SimpleType in the schema type hierarchy. Node Types, represented by * the class NodeTest, are also Patterns as used in XSLT. * * <p>Saxon assumes that apart from {@link AnyItemType} (which corresponds to <code>item()</item> * and matches anything), every ItemType will be either an {@link AtomicType}, or a * {@link client.net.sf.saxon.ce.pattern.NodeTest}. User-defined implementations of ItemType must therefore extend one of those * three classes/interfaces.</p> * @see AtomicType * @see client.net.sf.saxon.ce.pattern.NodeTest */ public interface ItemType { /** * Determine whether this item type is atomic (that is, whether it can ONLY match * atomic values) * @return true if this is ANY_ATOMIC_TYPE or a subtype thereof */ public boolean isAtomicType(); /** * Test whether a given item conforms to this type * @param item The item to be tested * @param allowURIPromotion * @param config * @return true if the item is an instance of this type; false otherwise */ public boolean matchesItem(Item item, boolean allowURIPromotion, Configuration config); /** * Get the type from which this item type is derived by restriction. This * is the supertype in the XPath type heirarchy, as distinct from the Schema * base type: this means that the supertype of xs:boolean is xs:anyAtomicType, * whose supertype is item() (rather than xs:anySimpleType). * <p> * In fact the concept of "supertype" is not really well-defined, because the types * form a lattice rather than a hierarchy. The only real requirement on this function * is that it returns a type that strictly subsumes this type, ideally as narrowly * as possible. * @return the supertype, or null if this type is item() * @param th the type hierarchy cache */ public ItemType getSuperType(TypeHierarchy th); /** * Get the primitive item type corresponding to this item type. For item(), * this is Type.ITEM. For node(), it is Type.NODE. For specific node kinds, * it is the value representing the node kind, for example Type.ELEMENT. * For anyAtomicValue it is Type.ATOMIC_VALUE. For numeric it is Type.NUMBER. * For other atomic types it is the primitive type as defined in XML Schema, * except that integer, xs:dayTimeDuration, and xs:yearMonthDuration * are considered to be primitive types. */ public ItemType getPrimitiveItemType(); /** * Get the primitive type corresponding to this item type. For item(), * this is Type.ITEM. For node(), it is Type.NODE. For specific node kinds, * it is the value representing the node kind, for example Type.ELEMENT. * For anyAtomicValue it is Type.ATOMIC_VALUE. For numeric it is Type.NUMBER. * For other atomic types it is the primitive type as defined in XML Schema, * except that INTEGER is considered to be a primitive type. */ public int getPrimitiveType(); /** * Produce a representation of this type name for use in error messages. * Where this is a QName, it will use conventional prefixes * @param pool the name pool * @return a string representation of the type, in notation resembling but not necessarily * identical to XPath syntax */ public String toString(NamePool pool); /** * Get the item type of the atomic values that will be produced when an item * of this type is atomized * @return the item type of the atomic values that will be produced when an item * of this type is atomized */ public AtomicType getAtomizedItemType(); } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.