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: TransformSnapshotImpl.java 468645 2006-10-28 06:57:24Z minchau $ 020 */ 021 package org.apache.xalan.transformer; 022 023 import java.util.Enumeration; 024 import java.util.Stack; 025 026 import org.apache.xml.dtm.DTMIterator; 027 import org.apache.xml.utils.BoolStack; 028 import org.apache.xml.utils.IntStack; 029 import org.apache.xml.utils.NamespaceSupport2; 030 import org.apache.xml.utils.NodeVector; 031 import org.apache.xml.utils.ObjectStack; 032 import org.apache.xpath.VariableStack; 033 import org.apache.xpath.XPathContext; 034 035 import org.xml.sax.helpers.NamespaceSupport; 036 037 import org.apache.xml.serializer.NamespaceMappings; 038 import org.apache.xml.serializer.SerializationHandler; 039 /** 040 * This class holds a "snapshot" of it's current transformer state, 041 * which can later be restored. 042 * 043 * This only saves state which can change over the course of the side-effect-free 044 * (i.e. no extensions that call setURIResolver, etc.). 045 * 046 * @deprecated It doesn't look like this code, which is for tooling, has 047 * functioned propery for a while, so it doesn't look like it is being used. 048 */ 049 class TransformSnapshotImpl implements TransformSnapshot 050 { 051 052 /** 053 * The stack of Variable stack frames. 054 */ 055 private VariableStack m_variableStacks; 056 057 /** 058 * The stack of <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a> objects. 059 * Not to be confused with the current node list. 060 */ 061 private IntStack m_currentNodes; 062 063 /** A stack of the current sub-expression nodes. */ 064 private IntStack m_currentExpressionNodes; 065 066 /** 067 * The current context node lists stack. 068 */ 069 private Stack m_contextNodeLists; 070 071 /** 072 * The current context node list. 073 */ 074 private DTMIterator m_contextNodeList; 075 076 /** 077 * Stack of AxesIterators. 078 */ 079 private Stack m_axesIteratorStack; 080 081 /** 082 * Is > 0 when we're processing a for-each. 083 */ 084 private BoolStack m_currentTemplateRuleIsNull; 085 086 /** 087 * A node vector used as a stack to track the current 088 * ElemTemplateElement. Needed for the 089 * org.apache.xalan.transformer.TransformState interface, 090 * so a tool can discover the calling template. 091 */ 092 private ObjectStack m_currentTemplateElements; 093 094 /** 095 * A node vector used as a stack to track the current 096 * ElemTemplate that was matched, as well as the node that 097 * was matched. Needed for the 098 * org.apache.xalan.transformer.TransformState interface, 099 * so a tool can discover the matched template, and matched 100 * node. 101 */ 102 private Stack m_currentMatchTemplates; 103 104 /** 105 * A node vector used as a stack to track the current 106 * ElemTemplate that was matched, as well as the node that 107 * was matched. Needed for the 108 * org.apache.xalan.transformer.TransformState interface, 109 * so a tool can discover the matched template, and matched 110 * node. 111 */ 112 private NodeVector m_currentMatchNodes; 113 114 /** 115 * The table of counters for xsl:number support. 116 * @see ElemNumber 117 */ 118 private CountersTable m_countersTable; 119 120 /** 121 * Stack for the purposes of flagging infinite recursion with 122 * attribute sets. 123 */ 124 private Stack m_attrSetStack; 125 126 /** Indicate whether a namespace context was pushed */ 127 boolean m_nsContextPushed; 128 129 /** 130 * Use the SAX2 helper class to track result namespaces. 131 */ 132 private NamespaceMappings m_nsSupport; 133 134 /** The number of events queued */ 135 // int m_eventCount; 136 137 /** 138 * Constructor TransformSnapshotImpl 139 * Take a snapshot of the currently executing context. 140 * 141 * @param transformer Non null transformer instance 142 * @deprecated It doesn't look like this code, which is for tooling, has 143 * functioned propery for a while, so it doesn't look like it is being used. 144 */ 145 TransformSnapshotImpl(TransformerImpl transformer) 146 { 147 148 try 149 { 150 151 // Are all these clones deep enough? 152 SerializationHandler rtf = transformer.getResultTreeHandler(); 153 154 { 155 // save serializer fields 156 m_nsSupport = (NamespaceMappings)rtf.getNamespaceMappings().clone(); 157 158 // Do other fields need to be saved/restored? 159 } 160 161 XPathContext xpc = transformer.getXPathContext(); 162 163 m_variableStacks = (VariableStack) xpc.getVarStack().clone(); 164 m_currentNodes = (IntStack) xpc.getCurrentNodeStack().clone(); 165 m_currentExpressionNodes = 166 (IntStack) xpc.getCurrentExpressionNodeStack().clone(); 167 m_contextNodeLists = (Stack) xpc.getContextNodeListsStack().clone(); 168 169 if (!m_contextNodeLists.empty()) 170 m_contextNodeList = 171 (DTMIterator) xpc.getContextNodeList().clone(); 172 173 m_axesIteratorStack = (Stack) xpc.getAxesIteratorStackStacks().clone(); 174 m_currentTemplateRuleIsNull = 175 (BoolStack) transformer.m_currentTemplateRuleIsNull.clone(); 176 m_currentTemplateElements = 177 (ObjectStack) transformer.m_currentTemplateElements.clone(); 178 m_currentMatchTemplates = 179 (Stack) transformer.m_currentMatchTemplates.clone(); 180 m_currentMatchNodes = 181 (NodeVector) transformer.m_currentMatchedNodes.clone(); 182 m_countersTable = 183 (CountersTable) transformer.getCountersTable().clone(); 184 185 if (transformer.m_attrSetStack != null) 186 m_attrSetStack = (Stack) transformer.m_attrSetStack.clone(); 187 } 188 catch (CloneNotSupportedException cnse) 189 { 190 throw new org.apache.xml.utils.WrappedRuntimeException(cnse); 191 } 192 } 193 194 /** 195 * This will reset the stylesheet to a given execution context 196 * based on some previously taken snapshot where we can then start execution 197 * 198 * @param transformer Non null transformer instance 199 * 200 * @deprecated It doesn't look like this code, which is for tooling, has 201 * functioned propery for a while, so it doesn't look like it is being used. 202 */ 203 void apply(TransformerImpl transformer) 204 { 205 206 try 207 { 208 209 // Are all these clones deep enough? 210 SerializationHandler rtf = transformer.getResultTreeHandler(); 211 212 if (rtf != null) 213 { 214 // restore serializer fields 215 rtf.setNamespaceMappings((NamespaceMappings)m_nsSupport.clone()); 216 } 217 218 XPathContext xpc = transformer.getXPathContext(); 219 220 xpc.setVarStack((VariableStack) m_variableStacks.clone()); 221 xpc.setCurrentNodeStack((IntStack) m_currentNodes.clone()); 222 xpc.setCurrentExpressionNodeStack( 223 (IntStack) m_currentExpressionNodes.clone()); 224 xpc.setContextNodeListsStack((Stack) m_contextNodeLists.clone()); 225 226 if (m_contextNodeList != null) 227 xpc.pushContextNodeList((DTMIterator) m_contextNodeList.clone()); 228 229 xpc.setAxesIteratorStackStacks((Stack) m_axesIteratorStack.clone()); 230 231 transformer.m_currentTemplateRuleIsNull = 232 (BoolStack) m_currentTemplateRuleIsNull.clone(); 233 transformer.m_currentTemplateElements = 234 (ObjectStack) m_currentTemplateElements.clone(); 235 transformer.m_currentMatchTemplates = 236 (Stack) m_currentMatchTemplates.clone(); 237 transformer.m_currentMatchedNodes = 238 (NodeVector) m_currentMatchNodes.clone(); 239 transformer.m_countersTable = (CountersTable) m_countersTable.clone(); 240 241 if (m_attrSetStack != null) 242 transformer.m_attrSetStack = (Stack) m_attrSetStack.clone(); 243 } 244 catch (CloneNotSupportedException cnse) 245 { 246 throw new org.apache.xml.utils.WrappedRuntimeException(cnse); 247 } 248 } 249 }