Home | History | Annotate | Download | only in transformer
      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 
     22 package org.apache.xalan.transformer;
     23 
     24 import javax.xml.transform.Transformer;
     25 
     26 import org.apache.xalan.templates.ElemTemplate;
     27 import org.apache.xalan.templates.ElemTemplateElement;
     28 import org.apache.xml.dtm.DTM;
     29 import org.apache.xml.dtm.DTMIterator;
     30 import org.w3c.dom.Node;
     31 import org.w3c.dom.traversal.NodeIterator;
     32 
     33 /**
     34  * Before the serializer merge, the TransformState interface was
     35  * implemented by ResultTreeHandler.
     36  */
     37 public 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