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: QueuedEvents.java 468645 2006-10-28 06:57:24Z minchau $
020     */
021    package org.apache.xalan.transformer;
022    
023    import java.util.Vector;
024    
025    import org.apache.xml.utils.MutableAttrListImpl;
026    
027    
028    /**
029     * This class acts as a base for ResultTreeHandler, and keeps
030     * queud stack events.  In truth, we don't need a stack,
031     * so I may change this down the line a bit.
032     */
033    public abstract class QueuedEvents
034    {
035    
036      /** The number of events queued          */
037      protected int m_eventCount = 0;
038    
039      /** Queued start document          */
040      // QueuedStartDocument m_startDoc = new QueuedStartDocument();
041    
042      /** Queued start element          */
043      // QueuedStartElement m_startElement = new QueuedStartElement();
044      
045      public boolean m_docPending = false;
046      protected boolean m_docEnded = false;
047      
048      /** Flag indicating that an event is pending.  Public for 
049       *  fast access by ElemForEach.         */
050      public boolean m_elemIsPending = false;
051    
052      /** Flag indicating that an event is ended          */
053      public boolean m_elemIsEnded = false;
054      
055      /**
056       * The pending attributes.  We have to delay the call to
057       * m_flistener.startElement(name, atts) because of the
058       * xsl:attribute and xsl:copy calls.  In other words,
059       * the attributes have to be fully collected before you
060       * can call startElement.
061       */
062      protected MutableAttrListImpl m_attributes = new MutableAttrListImpl();
063    
064      /**
065       * Flag to try and get the xmlns decls to the attribute list
066       * before other attributes are added.
067       */
068      protected boolean m_nsDeclsHaveBeenAdded = false;
069    
070      /**
071       * The pending element, namespace, and local name.
072       */
073      protected String m_name;
074    
075      /** Namespace URL of the element          */
076      protected String m_url;
077    
078      /** Local part of qualified name of the element           */
079      protected String m_localName;
080      
081      
082      /** Vector of namespaces for this element          */
083      protected Vector m_namespaces = null;
084    
085    //  /**
086    //   * Get the queued element.
087    //   *
088    //   * @return the queued element.
089    //   */
090    //  QueuedStartElement getQueuedElem()
091    //  {
092    //    return (m_eventCount > 1) ? m_startElement : null;
093    //  }
094    
095      /**
096       * To re-initialize the document and element events 
097       *
098       */
099      protected void reInitEvents()
100      {
101      }
102    
103      /**
104       * Push document event and re-initialize events  
105       *
106       */
107      public void reset()
108      {
109        pushDocumentEvent();
110        reInitEvents();
111      }
112    
113      /**
114       * Push the document event.  This never gets popped.
115       */
116      void pushDocumentEvent()
117      {
118    
119        // m_startDoc.setPending(true);
120        // initQSE(m_startDoc);
121        m_docPending = true;
122    
123        m_eventCount++;
124      }
125    
126      /**
127       * Pop element event 
128       *
129       */
130      void popEvent()
131      {
132        m_elemIsPending = false;
133        m_attributes.clear();
134    
135        m_nsDeclsHaveBeenAdded = false;
136        m_name = null;
137        m_url = null;
138        m_localName = null;
139        m_namespaces = null;
140    
141        m_eventCount--;
142      }
143    
144      /** Instance of a serializer          */
145      private org.apache.xml.serializer.Serializer m_serializer;
146    
147      /**
148       * This is only for use of object pooling, so that
149       * it can be reset.
150       *
151       * @param s non-null instance of a serializer 
152       */
153      void setSerializer(org.apache.xml.serializer.Serializer s)
154      {
155        m_serializer = s;
156      }
157    
158      /**
159       * This is only for use of object pooling, so the that
160       * it can be reset.
161       *
162       * @return The serializer
163       */
164      org.apache.xml.serializer.Serializer getSerializer()
165      {
166        return m_serializer;
167      }
168    }