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: XalanTransformState.java 468645 2006-10-28 06:57:24Z minchau $ 020 */ 021 022 package org.apache.xalan.transformer; 023 024 import javax.xml.transform.Transformer; 025 026 import org.apache.xalan.templates.ElemTemplate; 027 import org.apache.xalan.templates.ElemTemplateElement; 028 import org.apache.xml.dtm.DTM; 029 import org.apache.xml.dtm.DTMIterator; 030 import org.w3c.dom.Node; 031 import org.w3c.dom.traversal.NodeIterator; 032 033 /** 034 * Before the serializer merge, the TransformState interface was 035 * implemented by ResultTreeHandler. 036 */ 037 public class XalanTransformState 038 implements TransformState { 039 040 Node m_node = null; 041 ElemTemplateElement m_currentElement = null; 042 ElemTemplate m_currentTemplate = null; 043 ElemTemplate m_matchedTemplate = null; 044 int m_currentNodeHandle = DTM.NULL; 045 Node m_currentNode = null; 046 int m_matchedNode = DTM.NULL; 047 DTMIterator m_contextNodeList = null; 048 boolean m_elemPending = false; 049 TransformerImpl m_transformer = null; 050 051 /** 052 * @see org.apache.xml.serializer.TransformStateSetter#setCurrentNode(Node) 053 */ 054 public void setCurrentNode(Node n) { 055 m_node = n; 056 } 057 058 /** 059 * @see org.apache.xml.serializer.TransformStateSetter#resetState(Transformer) 060 */ 061 public void resetState(Transformer transformer) { 062 if ((transformer != null) && (transformer instanceof TransformerImpl)) { 063 m_transformer = (TransformerImpl)transformer; 064 m_currentElement = m_transformer.getCurrentElement(); 065 m_currentTemplate = m_transformer.getCurrentTemplate(); 066 m_matchedTemplate = m_transformer.getMatchedTemplate(); 067 int currentNodeHandle = m_transformer.getCurrentNode(); 068 DTM dtm = m_transformer.getXPathContext().getDTM(currentNodeHandle); 069 m_currentNode = dtm.getNode(currentNodeHandle); 070 m_matchedNode = m_transformer.getMatchedNode(); 071 m_contextNodeList = m_transformer.getContextNodeList(); 072 } 073 } 074 075 /** 076 * @see org.apache.xalan.transformer.TransformState#getCurrentElement() 077 */ 078 public ElemTemplateElement getCurrentElement() { 079 if (m_elemPending) 080 return m_currentElement; 081 else 082 return m_transformer.getCurrentElement(); 083 } 084 085 /** 086 * @see org.apache.xalan.transformer.TransformState#getCurrentNode() 087 */ 088 public Node getCurrentNode() { 089 if (m_currentNode != null) { 090 return m_currentNode; 091 } else { 092 DTM dtm = m_transformer.getXPathContext().getDTM(m_transformer.getCurrentNode()); 093 return dtm.getNode(m_transformer.getCurrentNode()); 094 } 095 } 096 097 /** 098 * @see org.apache.xalan.transformer.TransformState#getCurrentTemplate() 099 */ 100 public ElemTemplate getCurrentTemplate() { 101 if (m_elemPending) 102 return m_currentTemplate; 103 else 104 return m_transformer.getCurrentTemplate(); 105 } 106 107 /** 108 * @see org.apache.xalan.transformer.TransformState#getMatchedTemplate() 109 */ 110 public ElemTemplate getMatchedTemplate() { 111 if (m_elemPending) 112 return m_matchedTemplate; 113 else 114 return m_transformer.getMatchedTemplate(); 115 } 116 117 /** 118 * @see org.apache.xalan.transformer.TransformState#getMatchedNode() 119 */ 120 public Node getMatchedNode() { 121 122 if (m_elemPending) { 123 DTM dtm = m_transformer.getXPathContext().getDTM(m_matchedNode); 124 return dtm.getNode(m_matchedNode); 125 } else { 126 DTM dtm = m_transformer.getXPathContext().getDTM(m_transformer.getMatchedNode()); 127 return dtm.getNode(m_transformer.getMatchedNode()); 128 } 129 } 130 131 /** 132 * @see org.apache.xalan.transformer.TransformState#getContextNodeList() 133 */ 134 public NodeIterator getContextNodeList() { 135 if (m_elemPending) { 136 return new org.apache.xml.dtm.ref.DTMNodeIterator(m_contextNodeList); 137 } else { 138 return new org.apache.xml.dtm.ref.DTMNodeIterator(m_transformer.getContextNodeList()); 139 } 140 } 141 /** 142 * @see org.apache.xalan.transformer.TransformState#getTransformer() 143 */ 144 public Transformer getTransformer() { 145 return m_transformer; 146 } 147 148 }