001: package net.sf.saxon.expr;
002:
003: import net.sf.saxon.om.Item;
004: import net.sf.saxon.om.NamePool;
005: import net.sf.saxon.om.SequenceIterator;
006: import net.sf.saxon.trans.DynamicError;
007: import net.sf.saxon.trans.XPathException;
008: import net.sf.saxon.type.AnyItemType;
009: import net.sf.saxon.type.ItemType;
010: import net.sf.saxon.type.TypeHierarchy;
011:
012: import java.io.PrintStream;
013:
014: /**
015: * Error expression: this expression is generated when the supplied expression cannot be
016: * parsed, and the containing element enables forwards-compatible processing. It defers
017: * the generation of an error message until an attempt is made to evaluate the expression
018: */
019:
020: public class ErrorExpression extends ComputedExpression {
021:
022: private XPathException exception; // the error found when parsing this expression
023:
024: /**
025: * Constructor
026: * @param exception the error found when parsing this expression
027: */
028:
029: public ErrorExpression(XPathException exception) {
030: this .exception = exception;
031: exception.setLocator(this ); // to remove any links to the compile-time stylesheet objects
032: };
033:
034: /**
035: * Type-check the expression.
036: */
037:
038: public Expression typeCheck(StaticContext env,
039: ItemType contextItemType) throws XPathException {
040: return this ;
041: }
042:
043: public Expression optimize(Optimizer opt, StaticContext env,
044: ItemType contextItemType) throws XPathException {
045: return this ;
046: }
047:
048: /**
049: * Evaluate the expression. This always throws the exception registered when the expression
050: * was first parsed.
051: */
052:
053: public Item evaluateItem(XPathContext context)
054: throws XPathException {
055: // copy the exception for thread-safety, because we want to add context information
056: DynamicError err = new DynamicError(exception.getMessage());
057: err.setLocator(ExpressionTool.getLocator(this ));
058: err.setErrorCode(exception.getErrorCodeLocalPart());
059: err.setXPathContext(context);
060: throw err;
061: }
062:
063: /**
064: * Iterate over the expression. This always throws the exception registered when the expression
065: * was first parsed.
066: */
067:
068: public SequenceIterator iterate(XPathContext context)
069: throws XPathException {
070: evaluateItem(context);
071: return null; // to fool the compiler
072: }
073:
074: /**
075: * Determine the data type of the expression, if possible
076: * @return Type.ITEM (meaning not known in advance)
077: * @param th
078: */
079:
080: public ItemType getItemType(TypeHierarchy th) {
081: return AnyItemType.getInstance();
082: }
083:
084: /**
085: * Determine the static cardinality
086: */
087:
088: public int computeCardinality() {
089: return StaticProperty.ALLOWS_ZERO_OR_MORE;
090: // we return a liberal value, so that we never get a type error reported
091: // statically
092: }
093:
094: /**
095: * Diagnostic print of expression structure
096: */
097:
098: public void display(int level, NamePool pool, PrintStream out) {
099: out.println(ExpressionTool.indent(level) + "**ERROR** ("
100: + exception.getMessage() + ')');
101: }
102:
103: }
104:
105: //
106: // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License");
107: // you may not use this file except in compliance with the License. You may obtain a copy of the
108: // License at http://www.mozilla.org/MPL/
109: //
110: // Software distributed under the License is distributed on an "AS IS" basis,
111: // WITHOUT WARRANTY OF ANY KIND, either express or implied.
112: // See the License for the specific language governing rights and limitations under the License.
113: //
114: // The Original Code is: all this file.
115: //
116: // The Initial Developer of the Original Code is Michael H. Kay.
117: //
118: // Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved.
119: //
120: // Contributor(s): none.
121: //
|