001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: XRTreeFragSelectWrapper.java 468655 2006-10-28 07:12:06Z minchau $ 020 */ 021 package org.apache.xpath.objects; 022 023 import org.apache.xalan.res.XSLMessages; 024 import org.apache.xml.dtm.DTMIterator; 025 import org.apache.xml.utils.XMLString; 026 import org.apache.xpath.Expression; 027 import org.apache.xpath.XPathContext; 028 import org.apache.xpath.res.XPATHErrorResources; 029 030 /** 031 * This class makes an select statement act like an result tree fragment. 032 */ 033 public class XRTreeFragSelectWrapper extends XRTreeFrag implements Cloneable 034 { 035 static final long serialVersionUID = -6526177905590461251L; 036 public XRTreeFragSelectWrapper(Expression expr) 037 { 038 super(expr); 039 } 040 041 /** 042 * This function is used to fixup variables from QNames to stack frame 043 * indexes at stylesheet build time. 044 * @param vars List of QNames that correspond to variables. This list 045 * should be searched backwards for the first qualified name that 046 * corresponds to the variable reference qname. The position of the 047 * QName in the vector from the start of the vector will be its position 048 * in the stack frame (but variables above the globalsTop value will need 049 * to be offset to the current stack frame). 050 */ 051 public void fixupVariables(java.util.Vector vars, int globalsSize) 052 { 053 ((Expression)m_obj).fixupVariables(vars, globalsSize); 054 } 055 056 /** 057 * For support of literal objects in xpaths. 058 * 059 * @param xctxt The XPath execution context. 060 * 061 * @return the result of executing the select expression 062 * 063 * @throws javax.xml.transform.TransformerException 064 */ 065 public XObject execute(XPathContext xctxt) 066 throws javax.xml.transform.TransformerException 067 { 068 XObject m_selected; 069 m_selected = ((Expression)m_obj).execute(xctxt); 070 m_selected.allowDetachToRelease(m_allowRelease); 071 if (m_selected.getType() == CLASS_STRING) 072 return m_selected; 073 else 074 return new XString(m_selected.str()); 075 } 076 077 /** 078 * Detaches the <code>DTMIterator</code> from the set which it iterated 079 * over, releasing any computational resources and placing the iterator 080 * in the INVALID state. After <code>detach</code> has been invoked, 081 * calls to <code>nextNode</code> or <code>previousNode</code> will 082 * raise a runtime exception. 083 * 084 * In general, detach should only be called once on the object. 085 */ 086 public void detach() 087 { 088 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_DETACH_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"detach() not supported by XRTreeFragSelectWrapper!"); 089 } 090 091 /** 092 * Cast result object to a number. 093 * 094 * @return The result tree fragment as a number or NaN 095 */ 096 public double num() 097 throws javax.xml.transform.TransformerException 098 { 099 100 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NUM_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"num() not supported by XRTreeFragSelectWrapper!"); 101 } 102 103 104 /** 105 * Cast result object to an XMLString. 106 * 107 * @return The document fragment node data or the empty string. 108 */ 109 public XMLString xstr() 110 { 111 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_XSTR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"xstr() not supported by XRTreeFragSelectWrapper!"); 112 } 113 114 /** 115 * Cast result object to a string. 116 * 117 * @return The document fragment node data or the empty string. 118 */ 119 public String str() 120 { 121 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_STR_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"str() not supported by XRTreeFragSelectWrapper!"); 122 } 123 124 /** 125 * Tell what kind of class this is. 126 * 127 * @return the string type 128 */ 129 public int getType() 130 { 131 return CLASS_STRING; 132 } 133 134 /** 135 * Cast result object to a result tree fragment. 136 * 137 * @return The document fragment this wraps 138 */ 139 public int rtf() 140 { 141 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"rtf() not supported by XRTreeFragSelectWrapper!"); 142 } 143 144 /** 145 * Cast result object to a DTMIterator. 146 * 147 * @return The document fragment as a DTMIterator 148 */ 149 public DTMIterator asNodeIterator() 150 { 151 throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"asNodeIterator() not supported by XRTreeFragSelectWrapper!"); 152 } 153 154 }