1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the  "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18/*
19 * $Id: XalanTransformState.java 468645 2006-10-28 06:57:24Z minchau $
20 */
21
22package org.apache.xalan.transformer;
23
24import javax.xml.transform.Transformer;
25
26import org.apache.xalan.templates.ElemTemplate;
27import org.apache.xalan.templates.ElemTemplateElement;
28import org.apache.xml.dtm.DTM;
29import org.apache.xml.dtm.DTMIterator;
30import org.w3c.dom.Node;
31import org.w3c.dom.traversal.NodeIterator;
32
33/**
34 * Before the serializer merge, the TransformState interface was
35 * implemented by ResultTreeHandler.
36 */
37public class XalanTransformState
38    implements TransformState {
39
40    Node m_node = null;
41    ElemTemplateElement m_currentElement = null;
42    ElemTemplate m_currentTemplate = null;
43    ElemTemplate m_matchedTemplate = null;
44    int m_currentNodeHandle = DTM.NULL;
45    Node m_currentNode = null;
46    int m_matchedNode = DTM.NULL;
47    DTMIterator m_contextNodeList = null;
48    boolean m_elemPending = false;
49    TransformerImpl m_transformer = null;
50
51    /**
52     * @see org.apache.xml.serializer.TransformStateSetter#setCurrentNode(Node)
53     */
54    public void setCurrentNode(Node n) {
55        m_node = n;
56    }
57
58    /**
59     * @see org.apache.xml.serializer.TransformStateSetter#resetState(Transformer)
60     */
61    public void resetState(Transformer transformer) {
62        if ((transformer != null) && (transformer instanceof TransformerImpl)) {
63           m_transformer = (TransformerImpl)transformer;
64           m_currentElement = m_transformer.getCurrentElement();
65           m_currentTemplate = m_transformer.getCurrentTemplate();
66           m_matchedTemplate = m_transformer.getMatchedTemplate();
67           int currentNodeHandle = m_transformer.getCurrentNode();
68           DTM dtm = m_transformer.getXPathContext().getDTM(currentNodeHandle);
69           m_currentNode = dtm.getNode(currentNodeHandle);
70           m_matchedNode = m_transformer.getMatchedNode();
71           m_contextNodeList = m_transformer.getContextNodeList();
72        }
73    }
74
75    /**
76     * @see org.apache.xalan.transformer.TransformState#getCurrentElement()
77     */
78    public ElemTemplateElement getCurrentElement() {
79      if (m_elemPending)
80         return m_currentElement;
81      else
82         return m_transformer.getCurrentElement();
83    }
84
85    /**
86     * @see org.apache.xalan.transformer.TransformState#getCurrentNode()
87     */
88    public Node getCurrentNode() {
89      if (m_currentNode != null) {
90         return m_currentNode;
91      } else {
92         DTM dtm = m_transformer.getXPathContext().getDTM(m_transformer.getCurrentNode());
93         return dtm.getNode(m_transformer.getCurrentNode());
94      }
95    }
96
97    /**
98     * @see org.apache.xalan.transformer.TransformState#getCurrentTemplate()
99     */
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}
149