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: ExtendedContentHandler.java 468654 2006-10-28 07:09:23Z minchau $
020     */
021    package org.apache.xml.serializer;
022    
023    import javax.xml.transform.SourceLocator;
024    
025    import org.xml.sax.SAXException;
026    
027    /**
028     * This interface describes extensions to the SAX ContentHandler interface.
029     * It is intended to be used by a serializer. The methods on this interface will
030     * implement SAX- like behavior. This allows the gradual collection of
031     * information rather than having it all up front. For example the call
032     * <pre>
033     * startElement(namespaceURI,localName,qName,atts)
034     * </pre>
035     * could be replaced with the calls
036     * <pre>
037     * startElement(namespaceURI,localName,qName)
038     * addAttributes(atts)
039     * </pre>
040     * If there are no attributes the second call can be dropped. If attributes are
041     * to be added one at a time with calls to
042     * <pre>
043     * addAttribute(namespaceURI, localName, qName, type, value)
044     * </pre>
045     * @xsl.usage internal
046     */
047    public interface ExtendedContentHandler extends org.xml.sax.ContentHandler
048    {
049        /**
050         * Add at attribute to the current element
051         * @param uri the namespace URI of the attribute name
052         * @param localName the local name of the attribute (without prefix)
053         * @param rawName the qualified name of the attribute
054         * @param type the attribute type typically character data (CDATA)
055         * @param value the value of the attribute
056         * @param XSLAttribute true if the added attribute is coming from an xsl:attribute element
057         * @throws SAXException
058         */
059        public void addAttribute(
060            String uri,
061            String localName,
062            String rawName,
063            String type,
064            String value,
065            boolean XSLAttribute)
066            throws SAXException;
067        /**
068         * Add attributes to the current element
069         * @param atts the attributes to add.
070         * @throws SAXException
071         */
072        public void addAttributes(org.xml.sax.Attributes atts)
073            throws org.xml.sax.SAXException;
074        /**
075         * Add an attribute to the current element. The namespace URI of the
076         * attribute will be calculated from the prefix of qName. The local name
077         * will be derived from qName and the type will be assumed to be "CDATA".
078         * @param qName
079         * @param value
080         */
081        public void addAttribute(String qName, String value);
082        
083        /**
084         * This method is used to notify of a character event, but passing the data
085         * as a character String rather than the standard character array.
086         * @param chars the character data
087         * @throws SAXException
088         */
089        public void characters(String chars) throws SAXException;
090        
091        /**
092         * This method is used to notify of a character event, but passing the data
093         * as a DOM Node rather than the standard character array.
094         * @param node a DOM Node containing text.
095         * @throws SAXException
096         */    
097        public void characters(org.w3c.dom.Node node) throws org.xml.sax.SAXException;
098        /**
099         * This method is used to notify that an element has ended. Unlike the
100         * standard SAX method
101         * <pre>
102         * endElement(namespaceURI,localName,qName)
103         * </pre>
104         * only the last parameter is passed. If needed the serializer can derive
105         * the localName from the qualified name and derive the namespaceURI from
106         * its implementation.
107         * @param elemName the fully qualified element name.
108         * @throws SAXException
109         */
110        public void endElement(String elemName) throws SAXException;
111    
112        /**
113         * This method is used to notify that an element is starting.
114         * This method is just like the standard SAX method
115         * <pre>
116         * startElement(uri,localName,qname,atts)
117         * </pre>
118         * but without the attributes.
119         * @param uri the namespace URI of the element
120         * @param localName the local name (without prefix) of the element
121         * @param qName the qualified name of the element
122         * 
123         * @throws SAXException
124         */
125        public void startElement(String uri, String localName, String qName)
126            throws org.xml.sax.SAXException;
127    
128        /**
129         * This method is used to notify of the start of an element
130         * @param qName the fully qualified name of the element
131         * @throws SAXException
132         */
133        public void startElement(String qName) throws SAXException;
134        /**
135         * This method is used to notify that a prefix mapping is to start, but
136         * after an element is started. The SAX method call
137         * <pre>
138         * startPrefixMapping(prefix,uri)
139         * </pre>
140         * is used just before an element starts and applies to the element to come,
141         * not to the current element.  This method applies to the current element.
142         * For example one could make the calls in this order:
143         * <pre>
144         * startElement("prfx8:elem9")
145         * namespaceAfterStartElement("http://namespace8","prfx8")
146         * </pre>
147         * 
148         * @param uri the namespace URI being declared
149         * @param prefix the prefix that maps to the given namespace
150         * @throws SAXException
151         */
152        public void namespaceAfterStartElement(String uri, String prefix)
153            throws SAXException;
154    
155        /**
156         * This method is used to notify that a prefix maping is to start, which can
157         * be for the current element, or for the one to come.
158         * @param prefix the prefix that maps to the given URI
159         * @param uri the namespace URI of the given prefix
160         * @param shouldFlush if true this call is like the SAX
161         * startPrefixMapping(prefix,uri) call and the mapping applies to the
162         * element to come.  If false the mapping applies to the current element.
163         * @return boolean false if the prefix mapping was already in effect (in
164         * other words we are just re-declaring), true if this is a new, never
165         * before seen mapping for the element.
166         * @throws SAXException
167         */
168        public boolean startPrefixMapping(
169            String prefix,
170            String uri,
171            boolean shouldFlush)
172            throws SAXException;
173        /**
174         * Notify of an entity reference.
175         * @param entityName the name of the entity
176         * @throws SAXException
177         */
178        public void entityReference(String entityName) throws SAXException;
179    
180        /**
181         * This method returns an object that has the current namespace mappings in
182         * effect.
183         * 
184         * @return NamespaceMappings an object that has the current namespace
185         * mappings in effect.
186         */
187        public NamespaceMappings getNamespaceMappings();
188        /**
189         * This method returns the prefix that currently maps to the given namespace
190         * URI.
191         * @param uri the namespace URI
192         * @return String the prefix that currently maps to the given URI.
193         */
194        public String getPrefix(String uri);
195        /**
196         * This method gets the prefix associated with a current element or
197         * attribute name.
198         * @param name the qualified name of an element, or attribute
199         * @param isElement true if it is an element name, false if it is an
200         * atttribute name
201         * @return String the namespace URI associated with the element or
202         * attribute.
203         */
204        public String getNamespaceURI(String name, boolean isElement);
205        /**
206         * This method returns the namespace URI currently associated with the
207         * prefix.
208         * @param prefix a prefix of an element or attribute.
209         * @return String the namespace URI currently associated with the prefix.
210         */
211        public String getNamespaceURIFromPrefix(String prefix);
212    
213        /**
214         * This method is used to set the source locator, which might be used to
215         * generated an error message.
216         * @param locator the source locator
217         */
218        public void setSourceLocator(SourceLocator locator);
219    
220        // Bit constants for addUniqueAttribute().
221        
222        // The attribute value contains no bad characters. A "bad" character is one which
223        // is greater than 126 or it is one of '<', '>', '&' or '"'.
224        public static final int NO_BAD_CHARS = 0x1;
225        
226        // An HTML empty attribute (e.g. <OPTION selected>).
227        public static final int HTML_ATTREMPTY = 0x2;
228        
229        // An HTML URL attribute
230        public static final int HTML_ATTRURL = 0x4;
231    
232        /**
233         * Add a unique attribute to the current element.
234         * The attribute is guaranteed to be unique here. The serializer can write
235         * it out immediately without saving it in a table first. The integer
236         * flag contains information about the attribute, which helps the serializer
237         * to decide whether a particular processing is needed.
238         *
239         * @param qName the fully qualified attribute name.
240         * @param value the attribute value
241         * @param flags a bitwise flag
242         */
243        public void addUniqueAttribute(String qName, String value, int flags)
244            throws SAXException;
245        
246        /**
247         * Add an attribute from an xsl:attribute element.
248         * @param qName the qualified attribute name (prefix:localName)
249         * @param value the attributes value
250         * @param uri the uri that the prefix of the qName is mapped to.
251         */    
252        public void addXSLAttribute(String qName, final String value, final String uri);
253        
254        /**
255         * Add at attribute to the current element, not from an xsl:attribute
256         * element.
257         * @param uri the namespace URI of the attribute name
258         * @param localName the local name of the attribute (without prefix)
259         * @param rawName the qualified name of the attribute
260         * @param type the attribute type typically character data (CDATA)
261         * @param value the value of the attribute
262         * @throws SAXException
263         */
264        public void addAttribute(
265            String uri,
266            String localName,
267            String rawName,
268            String type,
269            String value)
270            throws SAXException;
271    }