net.sf.saxon.expr.ErrorExpression Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of saxon-he Show documentation
Show all versions of saxon-he Show documentation
An OSGi bundle for Saxon-HE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 Saxonica Limited.
// 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.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package net.sf.saxon.expr;
import net.sf.saxon.expr.parser.ExpressionVisitor;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.trace.ExpressionPresenter;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.type.AnyItemType;
import net.sf.saxon.type.ItemType;
import net.sf.saxon.type.TypeHierarchy;
/**
* Error expression: this expression is generated when the supplied expression cannot be
* parsed, and the containing element enables forwards-compatible processing. It defers
* the generation of an error message until an attempt is made to evaluate the expression
*/
public class ErrorExpression extends Expression {
private XPathException exception; // the error found when parsing this expression
/**
* This constructor is never executed, but it is used in the expression parser
* as a dummy so that the Java compiler recognizes parsing methods as always returning
* a non-null result.
*/
public ErrorExpression() {
this(new XPathException("Unspecified error"));
}
/**
* Constructor
* @param exception the error to be thrown when this expression is evaluated
*/
public ErrorExpression(XPathException exception) {
this.exception = exception;
exception.setLocator(this); // to remove any links to the compile-time stylesheet objects
}
/**
* Get the wrapped exception
* @return the exception to be thrown when the expression is evaluated
*/
public XPathException getException() {
return exception;
}
/**
* Type-check the expression.
*/
/*@NotNull*/
public Expression typeCheck(ExpressionVisitor visitor, ExpressionVisitor.ContextItemType contextItemType) throws XPathException {
return this;
}
/*@NotNull*/
public Expression optimize(ExpressionVisitor visitor, ExpressionVisitor.ContextItemType contextItemType) throws XPathException {
return this;
}
/**
* Evaluate the expression. This always throws the exception registered when the expression
* was first parsed.
*/
public Item evaluateItem(XPathContext context) throws XPathException {
// copy the exception for thread-safety, because we want to add context information
XPathException err = new XPathException(exception.getMessage());
err.setLocator(this);
err.setErrorCodeQName(exception.getErrorCodeQName());
err.setXPathContext(context);
throw err;
}
/**
* Iterate over the expression. This always throws the exception registered when the expression
* was first parsed.
*/
/*@NotNull*/
public SequenceIterator iterate(XPathContext context) throws XPathException {
evaluateItem(context);
return null; // to fool the compiler
}
/**
* Determine the data type of the expression, if possible
* @return Type.ITEM (meaning not known in advance)
* @param th the type hierarchy cache
*/
/*@NotNull*/
public ItemType getItemType(TypeHierarchy th) {
return AnyItemType.getInstance();
}
/**
* Determine the static cardinality
*/
public int computeCardinality() {
return StaticProperty.ALLOWS_ZERO_OR_MORE;
// we return a liberal value, so that we never get a type error reported
// statically
}
/**
* Copy an expression. This makes a deep copy.
*
* @return the copy of the original expression
*/
/*@NotNull*/
public Expression copy() {
return new ErrorExpression(exception);
}
/**
* Diagnostic print of expression structure. The abstract expression tree
* is written to the supplied output destination.
*/
public void explain(ExpressionPresenter destination) {
destination.startElement("error");
destination.emitAttribute("message", exception.getMessage());
destination.endElement();
}
}