src/java.xml/share/classes/com/sun/org/apache/xml/internal/serialize/BaseMarkupSerializer.java
author joehw
Thu, 21 Dec 2017 17:08:05 -0800
changeset 48412 d4412e380f6b
parent 48409 5ab69533994b
permissions -rw-r--r--
8184431: References to @sun.com Reviewed-by: lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
7f561c08de6b Initial load
duke
parents:
diff changeset
     1
/*
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
     2
 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
6
7f561c08de6b Initial load
duke
parents:
diff changeset
     3
 */
7f561c08de6b Initial load
duke
parents:
diff changeset
     4
/*
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
     5
 * Licensed to the Apache Software Foundation (ASF) under one or more
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
     6
 * contributor license agreements.  See the NOTICE file distributed with
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
     7
 * this work for additional information regarding copyright ownership.
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
     8
 * The ASF licenses this file to You under the Apache License, Version 2.0
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
     9
 * (the "License"); you may not use this file except in compliance with
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
    10
 * the License.  You may obtain a copy of the License at
6
7f561c08de6b Initial load
duke
parents:
diff changeset
    11
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
    12
 *      http://www.apache.org/licenses/LICENSE-2.0
7f561c08de6b Initial load
duke
parents:
diff changeset
    13
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
    14
 * Unless required by applicable law or agreed to in writing, software
7f561c08de6b Initial load
duke
parents:
diff changeset
    15
 * distributed under the License is distributed on an "AS IS" BASIS,
7f561c08de6b Initial load
duke
parents:
diff changeset
    16
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7f561c08de6b Initial load
duke
parents:
diff changeset
    17
 * See the License for the specific language governing permissions and
7f561c08de6b Initial load
duke
parents:
diff changeset
    18
 * limitations under the License.
7f561c08de6b Initial load
duke
parents:
diff changeset
    19
 */
7f561c08de6b Initial load
duke
parents:
diff changeset
    20
7f561c08de6b Initial load
duke
parents:
diff changeset
    21
// Sep 14, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    22
//  Fixed comments to preserve whitespaces and add a line break
7f561c08de6b Initial load
duke
parents:
diff changeset
    23
//  when indenting. Reported by Gervase Markham <gerv@gerv.net>
7f561c08de6b Initial load
duke
parents:
diff changeset
    24
// Sep 14, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    25
//  Fixed serializer to report IO exception directly, instead at
7f561c08de6b Initial load
duke
parents:
diff changeset
    26
//  the end of document processing.
7f561c08de6b Initial load
duke
parents:
diff changeset
    27
//  Reported by Patrick Higgins <phiggins@transzap.com>
7f561c08de6b Initial load
duke
parents:
diff changeset
    28
// Sep 13, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    29
//   CR in character data will print as &#0D;
7f561c08de6b Initial load
duke
parents:
diff changeset
    30
// Aug 25, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    31
//   Fixed processing instruction printing inside element content
7f561c08de6b Initial load
duke
parents:
diff changeset
    32
//   to not escape content. Reported by Mikael Staldal
7f561c08de6b Initial load
duke
parents:
diff changeset
    33
//   <d96-mst@d.kth.se>
7f561c08de6b Initial load
duke
parents:
diff changeset
    34
// Aug 25, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    35
//   Added ability to omit comments.
7f561c08de6b Initial load
duke
parents:
diff changeset
    36
//   Contributed by Anupam Bagchi <abagchi@jtcsv.com>
7f561c08de6b Initial load
duke
parents:
diff changeset
    37
// Aug 26, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    38
//   Fixed bug in newline handling when preserving spaces.
7f561c08de6b Initial load
duke
parents:
diff changeset
    39
//   Contributed by Mike Dusseault <mdusseault@home.com>
7f561c08de6b Initial load
duke
parents:
diff changeset
    40
// Aug 29, 2000:
7f561c08de6b Initial load
duke
parents:
diff changeset
    41
//   Fixed state.unescaped not being set to false when
7f561c08de6b Initial load
duke
parents:
diff changeset
    42
//   entering element state.
7f561c08de6b Initial load
duke
parents:
diff changeset
    43
//   Reported by Lowell Vaughn <lvaughn@agillion.com>
7f561c08de6b Initial load
duke
parents:
diff changeset
    44
7f561c08de6b Initial load
duke
parents:
diff changeset
    45
7f561c08de6b Initial load
duke
parents:
diff changeset
    46
package com.sun.org.apache.xml.internal.serialize;
7f561c08de6b Initial load
duke
parents:
diff changeset
    47
7f561c08de6b Initial load
duke
parents:
diff changeset
    48
7f561c08de6b Initial load
duke
parents:
diff changeset
    49
import com.sun.org.apache.xerces.internal.dom.DOMErrorImpl;
7f561c08de6b Initial load
duke
parents:
diff changeset
    50
import com.sun.org.apache.xerces.internal.dom.DOMLocatorImpl;
7f561c08de6b Initial load
duke
parents:
diff changeset
    51
import com.sun.org.apache.xerces.internal.dom.DOMMessageFormatter;
7f561c08de6b Initial load
duke
parents:
diff changeset
    52
import com.sun.org.apache.xerces.internal.util.XMLChar;
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
    53
import java.io.IOException;
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
    54
import java.io.OutputStream;
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
    55
import java.io.Writer;
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
    56
import java.util.ArrayList;
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
    57
import java.util.HashMap;
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
    58
import java.util.List;
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
    59
import java.util.Map;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
    60
import org.w3c.dom.DOMError;
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
    61
import org.w3c.dom.DOMErrorHandler;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
    62
import org.w3c.dom.Document;
7f561c08de6b Initial load
duke
parents:
diff changeset
    63
import org.w3c.dom.DocumentFragment;
7f561c08de6b Initial load
duke
parents:
diff changeset
    64
import org.w3c.dom.DocumentType;
7f561c08de6b Initial load
duke
parents:
diff changeset
    65
import org.w3c.dom.Element;
7f561c08de6b Initial load
duke
parents:
diff changeset
    66
import org.w3c.dom.Node;
7f561c08de6b Initial load
duke
parents:
diff changeset
    67
import org.w3c.dom.ls.LSException;
7f561c08de6b Initial load
duke
parents:
diff changeset
    68
import org.w3c.dom.ls.LSSerializerFilter;
7f561c08de6b Initial load
duke
parents:
diff changeset
    69
import org.w3c.dom.traversal.NodeFilter;
7f561c08de6b Initial load
duke
parents:
diff changeset
    70
import org.xml.sax.ContentHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
    71
import org.xml.sax.DTDHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
    72
import org.xml.sax.DocumentHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
    73
import org.xml.sax.Locator;
7f561c08de6b Initial load
duke
parents:
diff changeset
    74
import org.xml.sax.SAXException;
7f561c08de6b Initial load
duke
parents:
diff changeset
    75
import org.xml.sax.ext.DeclHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
    76
import org.xml.sax.ext.LexicalHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
    77
7f561c08de6b Initial load
duke
parents:
diff changeset
    78
/**
7f561c08de6b Initial load
duke
parents:
diff changeset
    79
 * Base class for a serializer supporting both DOM and SAX pretty
7f561c08de6b Initial load
duke
parents:
diff changeset
    80
 * serializing of XML/HTML/XHTML documents. Derives classes perform
7f561c08de6b Initial load
duke
parents:
diff changeset
    81
 * the method-specific serializing, this class provides the common
7f561c08de6b Initial load
duke
parents:
diff changeset
    82
 * serializing mechanisms.
7f561c08de6b Initial load
duke
parents:
diff changeset
    83
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
    84
 * The serializer must be initialized with the proper writer and
7f561c08de6b Initial load
duke
parents:
diff changeset
    85
 * output format before it can be used by calling {@link #setOutputCharStream}
7f561c08de6b Initial load
duke
parents:
diff changeset
    86
 * or {@link #setOutputByteStream} for the writer and {@link #setOutputFormat}
7f561c08de6b Initial load
duke
parents:
diff changeset
    87
 * for the output format.
7f561c08de6b Initial load
duke
parents:
diff changeset
    88
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
    89
 * The serializer can be reused any number of times, but cannot
7f561c08de6b Initial load
duke
parents:
diff changeset
    90
 * be used concurrently by two threads.
7f561c08de6b Initial load
duke
parents:
diff changeset
    91
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
    92
 * If an output stream is used, the encoding is taken from the
7f561c08de6b Initial load
duke
parents:
diff changeset
    93
 * output format (defaults to <tt>UTF-8</tt>). If a writer is
7f561c08de6b Initial load
duke
parents:
diff changeset
    94
 * used, make sure the writer uses the same encoding (if applies)
7f561c08de6b Initial load
duke
parents:
diff changeset
    95
 * as specified in the output format.
7f561c08de6b Initial load
duke
parents:
diff changeset
    96
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
    97
 * The serializer supports both DOM and SAX. DOM serializing is done
7f561c08de6b Initial load
duke
parents:
diff changeset
    98
 * by calling {@link #serialize(Document)} and SAX serializing is done by firing
7f561c08de6b Initial load
duke
parents:
diff changeset
    99
 * SAX events and using the serializer as a document handler.
7f561c08de6b Initial load
duke
parents:
diff changeset
   100
 * This also applies to derived class.
7f561c08de6b Initial load
duke
parents:
diff changeset
   101
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
   102
 * If an I/O exception occurs while serializing, the serializer
7f561c08de6b Initial load
duke
parents:
diff changeset
   103
 * will not throw an exception directly, but only throw it
7f561c08de6b Initial load
duke
parents:
diff changeset
   104
 * at the end of serializing (either DOM or SAX's {@link
7f561c08de6b Initial load
duke
parents:
diff changeset
   105
 * org.xml.sax.DocumentHandler#endDocument}.
7f561c08de6b Initial load
duke
parents:
diff changeset
   106
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
   107
 * For elements that are not specified as whitespace preserving,
7f561c08de6b Initial load
duke
parents:
diff changeset
   108
 * the serializer will potentially break long text lines at space
7f561c08de6b Initial load
duke
parents:
diff changeset
   109
 * boundaries, indent lines, and serialize elements on separate
7f561c08de6b Initial load
duke
parents:
diff changeset
   110
 * lines. Line terminators will be regarded as spaces, and
7f561c08de6b Initial load
duke
parents:
diff changeset
   111
 * spaces at beginning of line will be stripped.
7f561c08de6b Initial load
duke
parents:
diff changeset
   112
 * <p>
7f561c08de6b Initial load
duke
parents:
diff changeset
   113
 * When indenting, the serializer is capable of detecting seemingly
7f561c08de6b Initial load
duke
parents:
diff changeset
   114
 * element content, and serializing these elements indented on separate
7f561c08de6b Initial load
duke
parents:
diff changeset
   115
 * lines. An element is serialized indented when it is the first or
7f561c08de6b Initial load
duke
parents:
diff changeset
   116
 * last child of an element, or immediate following or preceding
7f561c08de6b Initial load
duke
parents:
diff changeset
   117
 * another element.
7f561c08de6b Initial load
duke
parents:
diff changeset
   118
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
   119
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
   120
 * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
48412
d4412e380f6b 8184431: References to @sun.com
joehw
parents: 48409
diff changeset
   121
 * @author Rahul Srivastava
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   122
 * @author Elena Litani, IBM
48412
d4412e380f6b 8184431: References to @sun.com
joehw
parents: 48409
diff changeset
   123
 * @author Sunitha Reddy
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   124
 * @see Serializer
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   125
 * @see org.w3c.dom.ls.LSSerializer
25834
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 23777
diff changeset
   126
 *
35800
6041f8d71ed1 8149601: Update references from "1.9" to "9"
iris
parents: 33349
diff changeset
   127
 * @deprecated As of JDK 9, Xerces 2.9.0, Xerces DOM L3 Serializer implementation
25834
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 23777
diff changeset
   128
 * is replaced by that of Xalan. Main class
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 23777
diff changeset
   129
 * {@link com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl} is replaced
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 23777
diff changeset
   130
 * by {@link com.sun.org.apache.xml.internal.serializer.dom3.LSSerializerImpl}.
48409
5ab69533994b 8193568: @LastModified tag in license header
joehw
parents: 47712
diff changeset
   131
 *
5ab69533994b 8193568: @LastModified tag in license header
joehw
parents: 47712
diff changeset
   132
 * @LastModified: Nov 2017
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   133
 */
45490
dc68478b53b9 8181153: Fix lint warnings in JAXP repo: dep-ann
joehw
parents: 35800
diff changeset
   134
@Deprecated
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   135
public abstract class BaseMarkupSerializer
7f561c08de6b Initial load
duke
parents:
diff changeset
   136
    implements ContentHandler, DocumentHandler, LexicalHandler,
7f561c08de6b Initial load
duke
parents:
diff changeset
   137
               DTDHandler, DeclHandler, DOMSerializer, Serializer
7f561c08de6b Initial load
duke
parents:
diff changeset
   138
{
7f561c08de6b Initial load
duke
parents:
diff changeset
   139
7f561c08de6b Initial load
duke
parents:
diff changeset
   140
    // DOM L3 implementation
7f561c08de6b Initial load
duke
parents:
diff changeset
   141
    protected short features = 0xFFFFFFFF;
7f561c08de6b Initial load
duke
parents:
diff changeset
   142
    protected DOMErrorHandler fDOMErrorHandler;
7f561c08de6b Initial load
duke
parents:
diff changeset
   143
    protected final DOMErrorImpl fDOMError = new DOMErrorImpl();
7f561c08de6b Initial load
duke
parents:
diff changeset
   144
    protected LSSerializerFilter fDOMFilter;
7f561c08de6b Initial load
duke
parents:
diff changeset
   145
7f561c08de6b Initial load
duke
parents:
diff changeset
   146
    protected EncodingInfo _encodingInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
   147
7f561c08de6b Initial load
duke
parents:
diff changeset
   148
7f561c08de6b Initial load
duke
parents:
diff changeset
   149
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   150
     * Holds array of all element states that have been entered.
7f561c08de6b Initial load
duke
parents:
diff changeset
   151
     * The array is automatically resized. When leaving an element,
7f561c08de6b Initial load
duke
parents:
diff changeset
   152
     * it's state is not removed but reused when later returning
7f561c08de6b Initial load
duke
parents:
diff changeset
   153
     * to the same nesting level.
7f561c08de6b Initial load
duke
parents:
diff changeset
   154
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   155
    private ElementState[]  _elementStates;
7f561c08de6b Initial load
duke
parents:
diff changeset
   156
7f561c08de6b Initial load
duke
parents:
diff changeset
   157
7f561c08de6b Initial load
duke
parents:
diff changeset
   158
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   159
     * The index of the next state to place in the array,
7f561c08de6b Initial load
duke
parents:
diff changeset
   160
     * or one plus the index of the current state. When zero,
7f561c08de6b Initial load
duke
parents:
diff changeset
   161
     * we are in no state.
7f561c08de6b Initial load
duke
parents:
diff changeset
   162
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   163
    private int             _elementStateCount;
7f561c08de6b Initial load
duke
parents:
diff changeset
   164
7f561c08de6b Initial load
duke
parents:
diff changeset
   165
7f561c08de6b Initial load
duke
parents:
diff changeset
   166
    /**
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   167
     * List holding comments and PIs that come before the root
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   168
     * element (even after it), see {@link #serializePreRoot}.
7f561c08de6b Initial load
duke
parents:
diff changeset
   169
     */
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   170
    private List<String> _preRoot;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   171
7f561c08de6b Initial load
duke
parents:
diff changeset
   172
7f561c08de6b Initial load
duke
parents:
diff changeset
   173
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   174
     * If the document has been started (header serialized), this
7f561c08de6b Initial load
duke
parents:
diff changeset
   175
     * flag is set to true so it's not started twice.
7f561c08de6b Initial load
duke
parents:
diff changeset
   176
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   177
    protected boolean       _started;
7f561c08de6b Initial load
duke
parents:
diff changeset
   178
7f561c08de6b Initial load
duke
parents:
diff changeset
   179
7f561c08de6b Initial load
duke
parents:
diff changeset
   180
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   181
     * True if the serializer has been prepared. This flag is set
7f561c08de6b Initial load
duke
parents:
diff changeset
   182
     * to false when the serializer is reset prior to using it,
7f561c08de6b Initial load
duke
parents:
diff changeset
   183
     * and to true after it has been prepared for usage.
7f561c08de6b Initial load
duke
parents:
diff changeset
   184
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   185
    private boolean         _prepared;
7f561c08de6b Initial load
duke
parents:
diff changeset
   186
7f561c08de6b Initial load
duke
parents:
diff changeset
   187
7f561c08de6b Initial load
duke
parents:
diff changeset
   188
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   189
     * Association between namespace URIs (keys) and prefixes (values).
7f561c08de6b Initial load
duke
parents:
diff changeset
   190
     * Accumulated here prior to starting an element and placing this
7f561c08de6b Initial load
duke
parents:
diff changeset
   191
     * list in the element state.
7f561c08de6b Initial load
duke
parents:
diff changeset
   192
     */
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
   193
    protected Map<String, String>  _prefixes;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   194
7f561c08de6b Initial load
duke
parents:
diff changeset
   195
7f561c08de6b Initial load
duke
parents:
diff changeset
   196
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   197
     * The system identifier of the document type, if known.
7f561c08de6b Initial load
duke
parents:
diff changeset
   198
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   199
    protected String        _docTypePublicId;
7f561c08de6b Initial load
duke
parents:
diff changeset
   200
7f561c08de6b Initial load
duke
parents:
diff changeset
   201
7f561c08de6b Initial load
duke
parents:
diff changeset
   202
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   203
     * The system identifier of the document type, if known.
7f561c08de6b Initial load
duke
parents:
diff changeset
   204
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   205
    protected String        _docTypeSystemId;
7f561c08de6b Initial load
duke
parents:
diff changeset
   206
7f561c08de6b Initial load
duke
parents:
diff changeset
   207
7f561c08de6b Initial load
duke
parents:
diff changeset
   208
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   209
     * The output format associated with this serializer. This will never
7f561c08de6b Initial load
duke
parents:
diff changeset
   210
     * be a null reference. If no format was passed to the constructor,
7f561c08de6b Initial load
duke
parents:
diff changeset
   211
     * the default one for this document type will be used. The format
7f561c08de6b Initial load
duke
parents:
diff changeset
   212
     * object is never changed by the serializer.
7f561c08de6b Initial load
duke
parents:
diff changeset
   213
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   214
    protected OutputFormat   _format;
7f561c08de6b Initial load
duke
parents:
diff changeset
   215
7f561c08de6b Initial load
duke
parents:
diff changeset
   216
7f561c08de6b Initial load
duke
parents:
diff changeset
   217
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   218
     * The printer used for printing text parts.
7f561c08de6b Initial load
duke
parents:
diff changeset
   219
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   220
    protected Printer       _printer;
7f561c08de6b Initial load
duke
parents:
diff changeset
   221
7f561c08de6b Initial load
duke
parents:
diff changeset
   222
7f561c08de6b Initial load
duke
parents:
diff changeset
   223
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   224
     * True if indenting printer.
7f561c08de6b Initial load
duke
parents:
diff changeset
   225
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   226
    protected boolean       _indenting;
7f561c08de6b Initial load
duke
parents:
diff changeset
   227
7f561c08de6b Initial load
duke
parents:
diff changeset
   228
    /** Temporary buffer to store character data */
7f561c08de6b Initial load
duke
parents:
diff changeset
   229
    protected final StringBuffer fStrBuffer = new StringBuffer(40);
7f561c08de6b Initial load
duke
parents:
diff changeset
   230
7f561c08de6b Initial load
duke
parents:
diff changeset
   231
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   232
     * The underlying writer.
7f561c08de6b Initial load
duke
parents:
diff changeset
   233
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   234
    private Writer          _writer;
7f561c08de6b Initial load
duke
parents:
diff changeset
   235
7f561c08de6b Initial load
duke
parents:
diff changeset
   236
7f561c08de6b Initial load
duke
parents:
diff changeset
   237
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   238
     * The output stream.
7f561c08de6b Initial load
duke
parents:
diff changeset
   239
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   240
    private OutputStream    _output;
7f561c08de6b Initial load
duke
parents:
diff changeset
   241
7f561c08de6b Initial load
duke
parents:
diff changeset
   242
    /** Current node that is being processed  */
7f561c08de6b Initial load
duke
parents:
diff changeset
   243
    protected Node fCurrentNode = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   244
7f561c08de6b Initial load
duke
parents:
diff changeset
   245
7f561c08de6b Initial load
duke
parents:
diff changeset
   246
7f561c08de6b Initial load
duke
parents:
diff changeset
   247
    //--------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   248
    // Constructor and initialization //
7f561c08de6b Initial load
duke
parents:
diff changeset
   249
    //--------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   250
7f561c08de6b Initial load
duke
parents:
diff changeset
   251
7f561c08de6b Initial load
duke
parents:
diff changeset
   252
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   253
     * Protected constructor can only be used by derived class.
7f561c08de6b Initial load
duke
parents:
diff changeset
   254
     * Must initialize the serializer before serializing any document,
7f561c08de6b Initial load
duke
parents:
diff changeset
   255
     * by calling {@link #setOutputCharStream} or {@link #setOutputByteStream}
7f561c08de6b Initial load
duke
parents:
diff changeset
   256
                 * first
7f561c08de6b Initial load
duke
parents:
diff changeset
   257
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   258
    protected BaseMarkupSerializer( OutputFormat format )
7f561c08de6b Initial load
duke
parents:
diff changeset
   259
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   260
        int i;
7f561c08de6b Initial load
duke
parents:
diff changeset
   261
7f561c08de6b Initial load
duke
parents:
diff changeset
   262
        _elementStates = new ElementState[ 10 ];
7f561c08de6b Initial load
duke
parents:
diff changeset
   263
        for ( i = 0 ; i < _elementStates.length ; ++i )
7f561c08de6b Initial load
duke
parents:
diff changeset
   264
            _elementStates[ i ] = new ElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   265
        _format = format;
7f561c08de6b Initial load
duke
parents:
diff changeset
   266
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   267
7f561c08de6b Initial load
duke
parents:
diff changeset
   268
7f561c08de6b Initial load
duke
parents:
diff changeset
   269
    public DocumentHandler asDocumentHandler()
7f561c08de6b Initial load
duke
parents:
diff changeset
   270
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   271
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   272
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   273
        return this;
7f561c08de6b Initial load
duke
parents:
diff changeset
   274
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   275
7f561c08de6b Initial load
duke
parents:
diff changeset
   276
7f561c08de6b Initial load
duke
parents:
diff changeset
   277
    public ContentHandler asContentHandler()
7f561c08de6b Initial load
duke
parents:
diff changeset
   278
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   279
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   280
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   281
        return this;
7f561c08de6b Initial load
duke
parents:
diff changeset
   282
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   283
7f561c08de6b Initial load
duke
parents:
diff changeset
   284
7f561c08de6b Initial load
duke
parents:
diff changeset
   285
    public DOMSerializer asDOMSerializer()
7f561c08de6b Initial load
duke
parents:
diff changeset
   286
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   287
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   288
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   289
        return this;
7f561c08de6b Initial load
duke
parents:
diff changeset
   290
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   291
7f561c08de6b Initial load
duke
parents:
diff changeset
   292
7f561c08de6b Initial load
duke
parents:
diff changeset
   293
    public void setOutputByteStream( OutputStream output )
7f561c08de6b Initial load
duke
parents:
diff changeset
   294
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   295
        if ( output == null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   296
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
   297
                                                           "ArgumentIsNull", new Object[]{"output"});
7f561c08de6b Initial load
duke
parents:
diff changeset
   298
            throw new NullPointerException(msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
   299
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   300
        _output = output;
7f561c08de6b Initial load
duke
parents:
diff changeset
   301
        _writer = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   302
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   303
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   304
7f561c08de6b Initial load
duke
parents:
diff changeset
   305
7f561c08de6b Initial load
duke
parents:
diff changeset
   306
    public void setOutputCharStream( Writer writer )
7f561c08de6b Initial load
duke
parents:
diff changeset
   307
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   308
        if ( writer == null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   309
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
   310
                                                           "ArgumentIsNull", new Object[]{"writer"});
7f561c08de6b Initial load
duke
parents:
diff changeset
   311
            throw new NullPointerException(msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
   312
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   313
        _writer = writer;
7f561c08de6b Initial load
duke
parents:
diff changeset
   314
        _output = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   315
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   316
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   317
7f561c08de6b Initial load
duke
parents:
diff changeset
   318
7f561c08de6b Initial load
duke
parents:
diff changeset
   319
    public void setOutputFormat( OutputFormat format )
7f561c08de6b Initial load
duke
parents:
diff changeset
   320
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   321
        if ( format == null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   322
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
   323
                                                           "ArgumentIsNull", new Object[]{"format"});
7f561c08de6b Initial load
duke
parents:
diff changeset
   324
            throw new NullPointerException(msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
   325
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   326
        _format = format;
7f561c08de6b Initial load
duke
parents:
diff changeset
   327
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   328
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   329
7f561c08de6b Initial load
duke
parents:
diff changeset
   330
7f561c08de6b Initial load
duke
parents:
diff changeset
   331
    public boolean reset()
7f561c08de6b Initial load
duke
parents:
diff changeset
   332
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   333
        if ( _elementStateCount > 1 ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   334
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
   335
                                                           "ResetInMiddle", null);
7f561c08de6b Initial load
duke
parents:
diff changeset
   336
            throw new IllegalStateException(msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
   337
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   338
        _prepared = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   339
        fCurrentNode = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   340
        fStrBuffer.setLength(0);
7f561c08de6b Initial load
duke
parents:
diff changeset
   341
        return true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   342
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   343
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   344
    protected void cleanup() {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   345
        fCurrentNode = null;
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   346
    }
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   347
7f561c08de6b Initial load
duke
parents:
diff changeset
   348
    protected void prepare()
7f561c08de6b Initial load
duke
parents:
diff changeset
   349
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   350
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   351
        if ( _prepared )
7f561c08de6b Initial load
duke
parents:
diff changeset
   352
            return;
7f561c08de6b Initial load
duke
parents:
diff changeset
   353
7f561c08de6b Initial load
duke
parents:
diff changeset
   354
        if ( _writer == null && _output == null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   355
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
   356
                                                           "NoWriterSupplied", null);
7f561c08de6b Initial load
duke
parents:
diff changeset
   357
            throw new IOException(msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
   358
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   359
        // If the output stream has been set, use it to construct
7f561c08de6b Initial load
duke
parents:
diff changeset
   360
        // the writer. It is possible that the serializer has been
7f561c08de6b Initial load
duke
parents:
diff changeset
   361
        // reused with the same output stream and different encoding.
7f561c08de6b Initial load
duke
parents:
diff changeset
   362
7f561c08de6b Initial load
duke
parents:
diff changeset
   363
        _encodingInfo = _format.getEncodingInfo();
7f561c08de6b Initial load
duke
parents:
diff changeset
   364
7f561c08de6b Initial load
duke
parents:
diff changeset
   365
        if ( _output != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   366
            _writer = _encodingInfo.getWriter(_output);
7f561c08de6b Initial load
duke
parents:
diff changeset
   367
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   368
7f561c08de6b Initial load
duke
parents:
diff changeset
   369
        if ( _format.getIndenting() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   370
            _indenting = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   371
            _printer = new IndentPrinter( _writer, _format );
7f561c08de6b Initial load
duke
parents:
diff changeset
   372
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   373
            _indenting = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   374
            _printer = new Printer( _writer, _format );
7f561c08de6b Initial load
duke
parents:
diff changeset
   375
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   376
7f561c08de6b Initial load
duke
parents:
diff changeset
   377
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   378
7f561c08de6b Initial load
duke
parents:
diff changeset
   379
        _elementStateCount = 0;
7f561c08de6b Initial load
duke
parents:
diff changeset
   380
        state = _elementStates[ 0 ];
7f561c08de6b Initial load
duke
parents:
diff changeset
   381
        state.namespaceURI = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   382
        state.localName = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   383
        state.rawName = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   384
        state.preserveSpace = _format.getPreserveSpace();
7f561c08de6b Initial load
duke
parents:
diff changeset
   385
        state.empty = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   386
        state.afterElement = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   387
        state.afterComment = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   388
        state.doCData = state.inCData = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   389
        state.prefixes = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
   390
7f561c08de6b Initial load
duke
parents:
diff changeset
   391
        _docTypePublicId = _format.getDoctypePublic();
7f561c08de6b Initial load
duke
parents:
diff changeset
   392
        _docTypeSystemId = _format.getDoctypeSystem();
7f561c08de6b Initial load
duke
parents:
diff changeset
   393
        _started = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   394
        _prepared = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   395
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   396
7f561c08de6b Initial load
duke
parents:
diff changeset
   397
7f561c08de6b Initial load
duke
parents:
diff changeset
   398
7f561c08de6b Initial load
duke
parents:
diff changeset
   399
    //----------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   400
    // DOM document serializing methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
   401
    //----------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   402
7f561c08de6b Initial load
duke
parents:
diff changeset
   403
7f561c08de6b Initial load
duke
parents:
diff changeset
   404
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   405
     * Serializes the DOM element using the previously specified
7f561c08de6b Initial load
duke
parents:
diff changeset
   406
     * writer and output format. Throws an exception only if
7f561c08de6b Initial load
duke
parents:
diff changeset
   407
     * an I/O exception occured while serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
   408
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
   409
     * @param elem The element to serialize
7f561c08de6b Initial load
duke
parents:
diff changeset
   410
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
   411
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
   412
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   413
    public void serialize( Element elem )
7f561c08de6b Initial load
duke
parents:
diff changeset
   414
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   415
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   416
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   417
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   418
        serializeNode( elem );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   419
        cleanup();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   420
        _printer.flush();
7f561c08de6b Initial load
duke
parents:
diff changeset
   421
        if ( _printer.getException() != null )
7f561c08de6b Initial load
duke
parents:
diff changeset
   422
            throw _printer.getException();
7f561c08de6b Initial load
duke
parents:
diff changeset
   423
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   424
7f561c08de6b Initial load
duke
parents:
diff changeset
   425
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   426
     * Serializes a node using the previously specified
7f561c08de6b Initial load
duke
parents:
diff changeset
   427
     * writer and output format. Throws an exception only if
7f561c08de6b Initial load
duke
parents:
diff changeset
   428
     * an I/O exception occured while serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
   429
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
   430
     * @param node Node to serialize
7f561c08de6b Initial load
duke
parents:
diff changeset
   431
     * @throws IOException An I/O exception occured while serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
   432
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   433
    public void serialize( Node node ) throws IOException {
7f561c08de6b Initial load
duke
parents:
diff changeset
   434
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   435
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   436
        serializeNode( node );
7f561c08de6b Initial load
duke
parents:
diff changeset
   437
        //Print any PIs and Comments which appeared in 'node'
7f561c08de6b Initial load
duke
parents:
diff changeset
   438
        serializePreRoot();
7f561c08de6b Initial load
duke
parents:
diff changeset
   439
        _printer.flush();
7f561c08de6b Initial load
duke
parents:
diff changeset
   440
        if ( _printer.getException() != null )
7f561c08de6b Initial load
duke
parents:
diff changeset
   441
            throw _printer.getException();
7f561c08de6b Initial load
duke
parents:
diff changeset
   442
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   443
7f561c08de6b Initial load
duke
parents:
diff changeset
   444
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   445
     * Serializes the DOM document fragmnt using the previously specified
7f561c08de6b Initial load
duke
parents:
diff changeset
   446
     * writer and output format. Throws an exception only if
7f561c08de6b Initial load
duke
parents:
diff changeset
   447
     * an I/O exception occured while serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
   448
     *
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   449
     * @param frag The document fragment to serialize
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   450
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
   451
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
   452
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   453
    public void serialize( DocumentFragment frag )
7f561c08de6b Initial load
duke
parents:
diff changeset
   454
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   455
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   456
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   457
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   458
        serializeNode( frag );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   459
        cleanup();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   460
        _printer.flush();
7f561c08de6b Initial load
duke
parents:
diff changeset
   461
        if ( _printer.getException() != null )
7f561c08de6b Initial load
duke
parents:
diff changeset
   462
            throw _printer.getException();
7f561c08de6b Initial load
duke
parents:
diff changeset
   463
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   464
7f561c08de6b Initial load
duke
parents:
diff changeset
   465
7f561c08de6b Initial load
duke
parents:
diff changeset
   466
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   467
     * Serializes the DOM document using the previously specified
7f561c08de6b Initial load
duke
parents:
diff changeset
   468
     * writer and output format. Throws an exception only if
7f561c08de6b Initial load
duke
parents:
diff changeset
   469
     * an I/O exception occured while serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
   470
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
   471
     * @param doc The document to serialize
7f561c08de6b Initial load
duke
parents:
diff changeset
   472
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
   473
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
   474
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   475
    public void serialize( Document doc )
7f561c08de6b Initial load
duke
parents:
diff changeset
   476
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   477
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   478
        reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
   479
        prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   480
        serializeNode( doc );
7f561c08de6b Initial load
duke
parents:
diff changeset
   481
        serializePreRoot();
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   482
        cleanup();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   483
        _printer.flush();
7f561c08de6b Initial load
duke
parents:
diff changeset
   484
        if ( _printer.getException() != null )
7f561c08de6b Initial load
duke
parents:
diff changeset
   485
            throw _printer.getException();
7f561c08de6b Initial load
duke
parents:
diff changeset
   486
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   487
7f561c08de6b Initial load
duke
parents:
diff changeset
   488
7f561c08de6b Initial load
duke
parents:
diff changeset
   489
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   490
    // SAX document handler serializing methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
   491
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   492
7f561c08de6b Initial load
duke
parents:
diff changeset
   493
7f561c08de6b Initial load
duke
parents:
diff changeset
   494
    public void startDocument()
7f561c08de6b Initial load
duke
parents:
diff changeset
   495
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   496
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   497
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   498
            prepare();
7f561c08de6b Initial load
duke
parents:
diff changeset
   499
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   500
            throw new SAXException( except.toString() );
7f561c08de6b Initial load
duke
parents:
diff changeset
   501
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   502
        // Nothing to do here. All the magic happens in startDocument(String)
7f561c08de6b Initial load
duke
parents:
diff changeset
   503
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   504
7f561c08de6b Initial load
duke
parents:
diff changeset
   505
7f561c08de6b Initial load
duke
parents:
diff changeset
   506
    public void characters( char[] chars, int start, int length )
7f561c08de6b Initial load
duke
parents:
diff changeset
   507
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   508
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   509
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   510
7f561c08de6b Initial load
duke
parents:
diff changeset
   511
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   512
        state = content();
7f561c08de6b Initial load
duke
parents:
diff changeset
   513
7f561c08de6b Initial load
duke
parents:
diff changeset
   514
        // Check if text should be print as CDATA section or unescaped
7f561c08de6b Initial load
duke
parents:
diff changeset
   515
        // based on elements listed in the output format (the element
7f561c08de6b Initial load
duke
parents:
diff changeset
   516
        // state) or whether we are inside a CDATA section or entity.
7f561c08de6b Initial load
duke
parents:
diff changeset
   517
7f561c08de6b Initial load
duke
parents:
diff changeset
   518
        if ( state.inCData || state.doCData ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   519
            int          saveIndent;
7f561c08de6b Initial load
duke
parents:
diff changeset
   520
7f561c08de6b Initial load
duke
parents:
diff changeset
   521
            // Print a CDATA section. The text is not escaped, but ']]>'
7f561c08de6b Initial load
duke
parents:
diff changeset
   522
            // appearing in the code must be identified and dealt with.
7f561c08de6b Initial load
duke
parents:
diff changeset
   523
            // The contents of a text node is considered space preserving.
7f561c08de6b Initial load
duke
parents:
diff changeset
   524
            if ( ! state.inCData ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   525
                _printer.printText( "<![CDATA[" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   526
                state.inCData = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   527
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   528
            saveIndent = _printer.getNextIndent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   529
            _printer.setNextIndent( 0 );
7f561c08de6b Initial load
duke
parents:
diff changeset
   530
            char ch;
7f561c08de6b Initial load
duke
parents:
diff changeset
   531
            final int end = start + length;
7f561c08de6b Initial load
duke
parents:
diff changeset
   532
            for ( int index = start ; index < end; ++index ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   533
                ch = chars[index];
7f561c08de6b Initial load
duke
parents:
diff changeset
   534
                if ( ch == ']' && index + 2 < end &&
7f561c08de6b Initial load
duke
parents:
diff changeset
   535
                     chars[ index + 1 ] == ']' && chars[ index + 2 ] == '>' ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   536
                    _printer.printText("]]]]><![CDATA[>");
7f561c08de6b Initial load
duke
parents:
diff changeset
   537
                    index +=2;
7f561c08de6b Initial load
duke
parents:
diff changeset
   538
                    continue;
7f561c08de6b Initial load
duke
parents:
diff changeset
   539
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
   540
                if (!XMLChar.isValid(ch)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   541
                    // check if it is surrogate
7f561c08de6b Initial load
duke
parents:
diff changeset
   542
                    if (++index < end) {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   543
                        surrogates(ch, chars[index],true);
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   544
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   545
                    else {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   546
                        fatalError("The character '"+ch+"' is an invalid XML character");
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   547
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   548
                    continue;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   549
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   550
                if ( ( ch >= ' ' && _encodingInfo.isPrintable(ch) && ch != 0x7F ) ||
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   551
                    ch == '\n' || ch == '\r' || ch == '\t' ) {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   552
                    _printer.printText(ch);
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   553
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   554
                else {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   555
                    // The character is not printable -- split CDATA section
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   556
                    _printer.printText("]]>&#x");
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   557
                    _printer.printText(Integer.toHexString(ch));
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
   558
                    _printer.printText(";<![CDATA[");
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   559
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
   560
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   561
            _printer.setNextIndent( saveIndent );
7f561c08de6b Initial load
duke
parents:
diff changeset
   562
7f561c08de6b Initial load
duke
parents:
diff changeset
   563
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   564
7f561c08de6b Initial load
duke
parents:
diff changeset
   565
            int saveIndent;
7f561c08de6b Initial load
duke
parents:
diff changeset
   566
7f561c08de6b Initial load
duke
parents:
diff changeset
   567
            if ( state.preserveSpace ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   568
                // If preserving space then hold of indentation so no
7f561c08de6b Initial load
duke
parents:
diff changeset
   569
                // excessive spaces are printed at line breaks, escape
7f561c08de6b Initial load
duke
parents:
diff changeset
   570
                // the text content without replacing spaces and print
7f561c08de6b Initial load
duke
parents:
diff changeset
   571
                // the text breaking only at line breaks.
7f561c08de6b Initial load
duke
parents:
diff changeset
   572
                saveIndent = _printer.getNextIndent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   573
                _printer.setNextIndent( 0 );
7f561c08de6b Initial load
duke
parents:
diff changeset
   574
                printText( chars, start, length, true, state.unescaped );
7f561c08de6b Initial load
duke
parents:
diff changeset
   575
                _printer.setNextIndent( saveIndent );
7f561c08de6b Initial load
duke
parents:
diff changeset
   576
            } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   577
                printText( chars, start, length, false, state.unescaped );
7f561c08de6b Initial load
duke
parents:
diff changeset
   578
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   579
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   580
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   581
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   582
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   583
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   584
7f561c08de6b Initial load
duke
parents:
diff changeset
   585
7f561c08de6b Initial load
duke
parents:
diff changeset
   586
    public void ignorableWhitespace( char[] chars, int start, int length )
7f561c08de6b Initial load
duke
parents:
diff changeset
   587
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   588
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   589
        int i;
7f561c08de6b Initial load
duke
parents:
diff changeset
   590
7f561c08de6b Initial load
duke
parents:
diff changeset
   591
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   592
        content();
7f561c08de6b Initial load
duke
parents:
diff changeset
   593
7f561c08de6b Initial load
duke
parents:
diff changeset
   594
        // Print ignorable whitespaces only when indenting, after
7f561c08de6b Initial load
duke
parents:
diff changeset
   595
        // all they are indentation. Cancel the indentation to
7f561c08de6b Initial load
duke
parents:
diff changeset
   596
        // not indent twice.
7f561c08de6b Initial load
duke
parents:
diff changeset
   597
        if ( _indenting ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   598
            _printer.setThisIndent( 0 );
7f561c08de6b Initial load
duke
parents:
diff changeset
   599
            for ( i = start ; length-- > 0 ; ++i )
7f561c08de6b Initial load
duke
parents:
diff changeset
   600
                _printer.printText( chars[ i ] );
7f561c08de6b Initial load
duke
parents:
diff changeset
   601
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   602
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   603
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   604
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   605
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   606
7f561c08de6b Initial load
duke
parents:
diff changeset
   607
7f561c08de6b Initial load
duke
parents:
diff changeset
   608
    public final void processingInstruction( String target, String code )
7f561c08de6b Initial load
duke
parents:
diff changeset
   609
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   610
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   611
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   612
            processingInstructionIO( target, code );
7f561c08de6b Initial load
duke
parents:
diff changeset
   613
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   614
        throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   615
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   616
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   617
7f561c08de6b Initial load
duke
parents:
diff changeset
   618
    public void processingInstructionIO( String target, String code )
7f561c08de6b Initial load
duke
parents:
diff changeset
   619
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   620
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   621
        int          index;
7f561c08de6b Initial load
duke
parents:
diff changeset
   622
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   623
7f561c08de6b Initial load
duke
parents:
diff changeset
   624
        state = content();
7f561c08de6b Initial load
duke
parents:
diff changeset
   625
7f561c08de6b Initial load
duke
parents:
diff changeset
   626
        // Create the processing instruction textual representation.
7f561c08de6b Initial load
duke
parents:
diff changeset
   627
        // Make sure we don't have '?>' inside either target or code.
7f561c08de6b Initial load
duke
parents:
diff changeset
   628
        index = target.indexOf( "?>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   629
        if ( index >= 0 )
7f561c08de6b Initial load
duke
parents:
diff changeset
   630
            fStrBuffer.append( "<?" ).append( target.substring( 0, index ) );
7f561c08de6b Initial load
duke
parents:
diff changeset
   631
        else
7f561c08de6b Initial load
duke
parents:
diff changeset
   632
            fStrBuffer.append( "<?" ).append( target );
7f561c08de6b Initial load
duke
parents:
diff changeset
   633
        if ( code != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   634
            fStrBuffer.append( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   635
            index = code.indexOf( "?>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   636
            if ( index >= 0 )
7f561c08de6b Initial load
duke
parents:
diff changeset
   637
                fStrBuffer.append( code.substring( 0, index ) );
7f561c08de6b Initial load
duke
parents:
diff changeset
   638
            else
7f561c08de6b Initial load
duke
parents:
diff changeset
   639
                fStrBuffer.append( code );
7f561c08de6b Initial load
duke
parents:
diff changeset
   640
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   641
        fStrBuffer.append( "?>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   642
7f561c08de6b Initial load
duke
parents:
diff changeset
   643
        // If before the root element (or after it), do not print
7f561c08de6b Initial load
duke
parents:
diff changeset
   644
        // the PI directly but place it in the pre-root vector.
7f561c08de6b Initial load
duke
parents:
diff changeset
   645
        if ( isDocumentState() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   646
            if ( _preRoot == null )
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   647
                _preRoot = new ArrayList<>();
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   648
            _preRoot.add( fStrBuffer.toString() );
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   649
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   650
            _printer.indent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   651
            printText( fStrBuffer.toString(), true, true );
7f561c08de6b Initial load
duke
parents:
diff changeset
   652
            _printer.unindent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   653
            if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   654
            state.afterElement = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   655
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   656
7f561c08de6b Initial load
duke
parents:
diff changeset
   657
        fStrBuffer.setLength(0);
7f561c08de6b Initial load
duke
parents:
diff changeset
   658
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   659
7f561c08de6b Initial load
duke
parents:
diff changeset
   660
7f561c08de6b Initial load
duke
parents:
diff changeset
   661
    public void comment( char[] chars, int start, int length )
7f561c08de6b Initial load
duke
parents:
diff changeset
   662
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   663
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   664
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   665
        comment( new String( chars, start, length ) );
7f561c08de6b Initial load
duke
parents:
diff changeset
   666
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   667
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   668
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   669
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   670
7f561c08de6b Initial load
duke
parents:
diff changeset
   671
7f561c08de6b Initial load
duke
parents:
diff changeset
   672
    public void comment( String text )
7f561c08de6b Initial load
duke
parents:
diff changeset
   673
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
   674
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   675
        int          index;
7f561c08de6b Initial load
duke
parents:
diff changeset
   676
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   677
7f561c08de6b Initial load
duke
parents:
diff changeset
   678
        if ( _format.getOmitComments() )
7f561c08de6b Initial load
duke
parents:
diff changeset
   679
            return;
7f561c08de6b Initial load
duke
parents:
diff changeset
   680
7f561c08de6b Initial load
duke
parents:
diff changeset
   681
        state  = content();
7f561c08de6b Initial load
duke
parents:
diff changeset
   682
        // Create the processing comment textual representation.
7f561c08de6b Initial load
duke
parents:
diff changeset
   683
        // Make sure we don't have '-->' inside the comment.
7f561c08de6b Initial load
duke
parents:
diff changeset
   684
        index = text.indexOf( "-->" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   685
        if ( index >= 0 )
7f561c08de6b Initial load
duke
parents:
diff changeset
   686
            fStrBuffer.append( "<!--" ).append( text.substring( 0, index ) ).append( "-->" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   687
        else
7f561c08de6b Initial load
duke
parents:
diff changeset
   688
            fStrBuffer.append( "<!--" ).append( text ).append( "-->" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   689
7f561c08de6b Initial load
duke
parents:
diff changeset
   690
        // If before the root element (or after it), do not print
7f561c08de6b Initial load
duke
parents:
diff changeset
   691
        // the comment directly but place it in the pre-root vector.
7f561c08de6b Initial load
duke
parents:
diff changeset
   692
        if ( isDocumentState() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   693
            if ( _preRoot == null )
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   694
                _preRoot = new ArrayList<>();
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
   695
            _preRoot.add( fStrBuffer.toString() );
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   696
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   697
            // Indent this element on a new line if the first
7f561c08de6b Initial load
duke
parents:
diff changeset
   698
            // content of the parent element or immediately
7f561c08de6b Initial load
duke
parents:
diff changeset
   699
            // following an element.
7f561c08de6b Initial load
duke
parents:
diff changeset
   700
            if ( _indenting && ! state.preserveSpace)
7f561c08de6b Initial load
duke
parents:
diff changeset
   701
                _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
   702
                                                _printer.indent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   703
            printText( fStrBuffer.toString(), true, true );
7f561c08de6b Initial load
duke
parents:
diff changeset
   704
                                                _printer.unindent();
7f561c08de6b Initial load
duke
parents:
diff changeset
   705
            if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   706
                state.afterElement = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   707
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   708
7f561c08de6b Initial load
duke
parents:
diff changeset
   709
        fStrBuffer.setLength(0);
7f561c08de6b Initial load
duke
parents:
diff changeset
   710
        state.afterComment = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   711
        state.afterElement = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   712
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   713
7f561c08de6b Initial load
duke
parents:
diff changeset
   714
7f561c08de6b Initial load
duke
parents:
diff changeset
   715
    public void startCDATA()
7f561c08de6b Initial load
duke
parents:
diff changeset
   716
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   717
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   718
7f561c08de6b Initial load
duke
parents:
diff changeset
   719
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   720
        state.doCData = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   721
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   722
7f561c08de6b Initial load
duke
parents:
diff changeset
   723
7f561c08de6b Initial load
duke
parents:
diff changeset
   724
    public void endCDATA()
7f561c08de6b Initial load
duke
parents:
diff changeset
   725
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   726
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   727
7f561c08de6b Initial load
duke
parents:
diff changeset
   728
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   729
        state.doCData = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   730
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   731
7f561c08de6b Initial load
duke
parents:
diff changeset
   732
7f561c08de6b Initial load
duke
parents:
diff changeset
   733
    public void startNonEscaping()
7f561c08de6b Initial load
duke
parents:
diff changeset
   734
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   735
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   736
7f561c08de6b Initial load
duke
parents:
diff changeset
   737
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   738
        state.unescaped = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   739
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   740
7f561c08de6b Initial load
duke
parents:
diff changeset
   741
7f561c08de6b Initial load
duke
parents:
diff changeset
   742
    public void endNonEscaping()
7f561c08de6b Initial load
duke
parents:
diff changeset
   743
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   744
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   745
7f561c08de6b Initial load
duke
parents:
diff changeset
   746
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   747
        state.unescaped = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   748
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   749
7f561c08de6b Initial load
duke
parents:
diff changeset
   750
7f561c08de6b Initial load
duke
parents:
diff changeset
   751
    public void startPreserving()
7f561c08de6b Initial load
duke
parents:
diff changeset
   752
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   753
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   754
7f561c08de6b Initial load
duke
parents:
diff changeset
   755
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   756
        state.preserveSpace = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
   757
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   758
7f561c08de6b Initial load
duke
parents:
diff changeset
   759
7f561c08de6b Initial load
duke
parents:
diff changeset
   760
    public void endPreserving()
7f561c08de6b Initial load
duke
parents:
diff changeset
   761
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   762
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
   763
7f561c08de6b Initial load
duke
parents:
diff changeset
   764
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
   765
        state.preserveSpace = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
   766
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   767
7f561c08de6b Initial load
duke
parents:
diff changeset
   768
7f561c08de6b Initial load
duke
parents:
diff changeset
   769
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
   770
     * Called at the end of the document to wrap it up.
7f561c08de6b Initial load
duke
parents:
diff changeset
   771
     * Will flush the output stream and throw an exception
7f561c08de6b Initial load
duke
parents:
diff changeset
   772
     * if any I/O error occured while serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
   773
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
   774
     * @throws SAXException An I/O exception occured during
7f561c08de6b Initial load
duke
parents:
diff changeset
   775
     *  serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
   776
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
   777
    public void endDocument()
7f561c08de6b Initial load
duke
parents:
diff changeset
   778
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   779
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   780
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   781
        // Print all the elements accumulated outside of
7f561c08de6b Initial load
duke
parents:
diff changeset
   782
        // the root element.
7f561c08de6b Initial load
duke
parents:
diff changeset
   783
        serializePreRoot();
7f561c08de6b Initial load
duke
parents:
diff changeset
   784
        // Flush the output, this is necessary for fStrBuffered output.
7f561c08de6b Initial load
duke
parents:
diff changeset
   785
        _printer.flush();
7f561c08de6b Initial load
duke
parents:
diff changeset
   786
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   787
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   788
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   789
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   790
7f561c08de6b Initial load
duke
parents:
diff changeset
   791
7f561c08de6b Initial load
duke
parents:
diff changeset
   792
    public void startEntity( String name )
7f561c08de6b Initial load
duke
parents:
diff changeset
   793
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   794
        // ???
7f561c08de6b Initial load
duke
parents:
diff changeset
   795
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   796
7f561c08de6b Initial load
duke
parents:
diff changeset
   797
7f561c08de6b Initial load
duke
parents:
diff changeset
   798
    public void endEntity( String name )
7f561c08de6b Initial load
duke
parents:
diff changeset
   799
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   800
        // ???
7f561c08de6b Initial load
duke
parents:
diff changeset
   801
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   802
7f561c08de6b Initial load
duke
parents:
diff changeset
   803
7f561c08de6b Initial load
duke
parents:
diff changeset
   804
    public void setDocumentLocator( Locator locator )
7f561c08de6b Initial load
duke
parents:
diff changeset
   805
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   806
        // Nothing to do
7f561c08de6b Initial load
duke
parents:
diff changeset
   807
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   808
7f561c08de6b Initial load
duke
parents:
diff changeset
   809
7f561c08de6b Initial load
duke
parents:
diff changeset
   810
    //-----------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   811
    // SAX content handler serializing methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
   812
    //-----------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   813
7f561c08de6b Initial load
duke
parents:
diff changeset
   814
7f561c08de6b Initial load
duke
parents:
diff changeset
   815
    public void skippedEntity ( String name )
7f561c08de6b Initial load
duke
parents:
diff changeset
   816
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   817
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   818
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   819
        endCDATA();
7f561c08de6b Initial load
duke
parents:
diff changeset
   820
        content();
7f561c08de6b Initial load
duke
parents:
diff changeset
   821
        _printer.printText( '&' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   822
        _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   823
        _printer.printText( ';' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   824
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   825
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   826
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   827
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   828
7f561c08de6b Initial load
duke
parents:
diff changeset
   829
7f561c08de6b Initial load
duke
parents:
diff changeset
   830
    public void startPrefixMapping( String prefix, String uri )
7f561c08de6b Initial load
duke
parents:
diff changeset
   831
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   832
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   833
        if ( _prefixes == null )
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
   834
            _prefixes = new HashMap<>();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
   835
        _prefixes.put( uri, prefix == null ? "" : prefix );
7f561c08de6b Initial load
duke
parents:
diff changeset
   836
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   837
7f561c08de6b Initial load
duke
parents:
diff changeset
   838
7f561c08de6b Initial load
duke
parents:
diff changeset
   839
    public void endPrefixMapping( String prefix )
7f561c08de6b Initial load
duke
parents:
diff changeset
   840
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   841
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   842
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   843
7f561c08de6b Initial load
duke
parents:
diff changeset
   844
7f561c08de6b Initial load
duke
parents:
diff changeset
   845
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   846
    // SAX DTD/Decl handler serializing methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
   847
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
   848
7f561c08de6b Initial load
duke
parents:
diff changeset
   849
7f561c08de6b Initial load
duke
parents:
diff changeset
   850
    public final void startDTD( String name, String publicId, String systemId )
7f561c08de6b Initial load
duke
parents:
diff changeset
   851
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   852
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   853
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   854
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   855
        _docTypePublicId = publicId;
7f561c08de6b Initial load
duke
parents:
diff changeset
   856
        _docTypeSystemId = systemId;
7f561c08de6b Initial load
duke
parents:
diff changeset
   857
7f561c08de6b Initial load
duke
parents:
diff changeset
   858
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   859
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   860
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   861
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   862
7f561c08de6b Initial load
duke
parents:
diff changeset
   863
7f561c08de6b Initial load
duke
parents:
diff changeset
   864
    public void endDTD()
7f561c08de6b Initial load
duke
parents:
diff changeset
   865
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   866
        // Nothing to do here, all the magic occurs in startDocument(String).
7f561c08de6b Initial load
duke
parents:
diff changeset
   867
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   868
7f561c08de6b Initial load
duke
parents:
diff changeset
   869
7f561c08de6b Initial load
duke
parents:
diff changeset
   870
    public void elementDecl( String name, String model )
7f561c08de6b Initial load
duke
parents:
diff changeset
   871
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   872
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   873
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   874
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   875
        _printer.printText( "<!ELEMENT " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   876
        _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   877
        _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   878
        _printer.printText( model );
7f561c08de6b Initial load
duke
parents:
diff changeset
   879
        _printer.printText( '>' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   880
        if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   881
            _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
   882
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   883
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   884
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   885
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   886
7f561c08de6b Initial load
duke
parents:
diff changeset
   887
7f561c08de6b Initial load
duke
parents:
diff changeset
   888
    public void attributeDecl( String eName, String aName, String type,
7f561c08de6b Initial load
duke
parents:
diff changeset
   889
                               String valueDefault, String value )
7f561c08de6b Initial load
duke
parents:
diff changeset
   890
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   891
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   892
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   893
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   894
        _printer.printText( "<!ATTLIST " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   895
        _printer.printText( eName );
7f561c08de6b Initial load
duke
parents:
diff changeset
   896
        _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   897
        _printer.printText( aName );
7f561c08de6b Initial load
duke
parents:
diff changeset
   898
        _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   899
        _printer.printText( type );
7f561c08de6b Initial load
duke
parents:
diff changeset
   900
        if ( valueDefault != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   901
            _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   902
            _printer.printText( valueDefault );
7f561c08de6b Initial load
duke
parents:
diff changeset
   903
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   904
        if ( value != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   905
            _printer.printText( " \"" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   906
            printEscaped( value );
7f561c08de6b Initial load
duke
parents:
diff changeset
   907
            _printer.printText( '"' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   908
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   909
        _printer.printText( '>' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   910
        if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   911
            _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
   912
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   913
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   914
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   915
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   916
7f561c08de6b Initial load
duke
parents:
diff changeset
   917
7f561c08de6b Initial load
duke
parents:
diff changeset
   918
    public void internalEntityDecl( String name, String value )
7f561c08de6b Initial load
duke
parents:
diff changeset
   919
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   920
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   921
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   922
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   923
        _printer.printText( "<!ENTITY " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   924
        _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   925
        _printer.printText( " \"" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   926
        printEscaped( value );
7f561c08de6b Initial load
duke
parents:
diff changeset
   927
        _printer.printText( "\">" );
7f561c08de6b Initial load
duke
parents:
diff changeset
   928
        if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   929
            _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
   930
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   931
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   932
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   933
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   934
7f561c08de6b Initial load
duke
parents:
diff changeset
   935
7f561c08de6b Initial load
duke
parents:
diff changeset
   936
    public void externalEntityDecl( String name, String publicId, String systemId )
7f561c08de6b Initial load
duke
parents:
diff changeset
   937
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   938
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   939
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   940
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   941
        unparsedEntityDecl( name, publicId, systemId, null );
7f561c08de6b Initial load
duke
parents:
diff changeset
   942
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   943
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   944
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   945
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   946
7f561c08de6b Initial load
duke
parents:
diff changeset
   947
7f561c08de6b Initial load
duke
parents:
diff changeset
   948
    public void unparsedEntityDecl( String name, String publicId,
7f561c08de6b Initial load
duke
parents:
diff changeset
   949
                                    String systemId, String notationName )
7f561c08de6b Initial load
duke
parents:
diff changeset
   950
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   951
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   952
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   953
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   954
        if ( publicId == null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   955
            _printer.printText( "<!ENTITY " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   956
            _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   957
            _printer.printText( " SYSTEM " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   958
            printDoctypeURL( systemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   959
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   960
            _printer.printText( "<!ENTITY " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   961
            _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   962
            _printer.printText( " PUBLIC " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   963
            printDoctypeURL( publicId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   964
            _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   965
            printDoctypeURL( systemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   966
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   967
        if ( notationName != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   968
            _printer.printText( " NDATA " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   969
            _printer.printText( notationName );
7f561c08de6b Initial load
duke
parents:
diff changeset
   970
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   971
        _printer.printText( '>' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   972
        if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
   973
            _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
   974
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   975
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
   976
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   977
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   978
7f561c08de6b Initial load
duke
parents:
diff changeset
   979
7f561c08de6b Initial load
duke
parents:
diff changeset
   980
    public void notationDecl( String name, String publicId, String systemId )
7f561c08de6b Initial load
duke
parents:
diff changeset
   981
        throws SAXException
7f561c08de6b Initial load
duke
parents:
diff changeset
   982
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
   983
        try {
7f561c08de6b Initial load
duke
parents:
diff changeset
   984
        _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
   985
        if ( publicId != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   986
            _printer.printText( "<!NOTATION " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   987
            _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   988
            _printer.printText( " PUBLIC " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   989
            printDoctypeURL( publicId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   990
            if ( systemId != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   991
                _printer.printText( ' ' );
7f561c08de6b Initial load
duke
parents:
diff changeset
   992
                printDoctypeURL( systemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   993
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   994
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   995
            _printer.printText( "<!NOTATION " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   996
            _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
   997
            _printer.printText( " SYSTEM " );
7f561c08de6b Initial load
duke
parents:
diff changeset
   998
            printDoctypeURL( systemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
   999
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1000
        _printer.printText( '>' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1001
        if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1002
            _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1003
        } catch ( IOException except ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1004
            throw new SAXException( except );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1005
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1006
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1007
7f561c08de6b Initial load
duke
parents:
diff changeset
  1008
7f561c08de6b Initial load
duke
parents:
diff changeset
  1009
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1010
    // Generic node serializing methods methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
  1011
    //------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1012
7f561c08de6b Initial load
duke
parents:
diff changeset
  1013
7f561c08de6b Initial load
duke
parents:
diff changeset
  1014
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1015
     * Serialize the DOM node. This method is shared across XML, HTML and XHTML
7f561c08de6b Initial load
duke
parents:
diff changeset
  1016
     * serializers and the differences are masked out in a separate {@link
7f561c08de6b Initial load
duke
parents:
diff changeset
  1017
     * #serializeElement}.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1018
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1019
     * @param node The node to serialize
7f561c08de6b Initial load
duke
parents:
diff changeset
  1020
     * @see #serializeElement
7f561c08de6b Initial load
duke
parents:
diff changeset
  1021
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
  1022
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1023
     */
47477
115ed64c7822 8181155: Fix lint warnings in JAXP repo: fallthrough and static
joehw
parents: 47359
diff changeset
  1024
    @SuppressWarnings("fallthrough") // by design at case Node.DOCUMENT_FRAGMENT_NODE
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1025
    protected void serializeNode( Node node )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1026
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1027
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1028
        fCurrentNode = node;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1029
7f561c08de6b Initial load
duke
parents:
diff changeset
  1030
        // Based on the node type call the suitable SAX handler.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1031
        // Only comments entities and documents which are not
7f561c08de6b Initial load
duke
parents:
diff changeset
  1032
        // handled by SAX are serialized directly.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1033
        switch ( node.getNodeType() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1034
        case Node.TEXT_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1035
            String text;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1036
7f561c08de6b Initial load
duke
parents:
diff changeset
  1037
            text = node.getNodeValue();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1038
            if ( text != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1039
                if (fDOMFilter !=null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1040
                    (fDOMFilter.getWhatToShow() & NodeFilter.SHOW_TEXT)!= 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1041
                    short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1042
                    switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1043
                        case NodeFilter.FILTER_REJECT:
7f561c08de6b Initial load
duke
parents:
diff changeset
  1044
                        case NodeFilter.FILTER_SKIP: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1045
                            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1046
                        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1047
                        default: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1048
                            characters(text);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1049
                        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1050
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1051
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1052
                else if ( !_indenting || getElementState().preserveSpace
7f561c08de6b Initial load
duke
parents:
diff changeset
  1053
                     || (text.replace('\n',' ').trim().length() != 0))
7f561c08de6b Initial load
duke
parents:
diff changeset
  1054
                    characters( text );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1055
7f561c08de6b Initial load
duke
parents:
diff changeset
  1056
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1057
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1058
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1059
7f561c08de6b Initial load
duke
parents:
diff changeset
  1060
        case Node.CDATA_SECTION_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1061
            String text = node.getNodeValue();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1062
            if ((features & DOMSerializerImpl.CDATA) != 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1063
                if (text != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1064
                    if (fDOMFilter != null
7f561c08de6b Initial load
duke
parents:
diff changeset
  1065
                        && (fDOMFilter.getWhatToShow()
7f561c08de6b Initial load
duke
parents:
diff changeset
  1066
                            & NodeFilter.SHOW_CDATA_SECTION)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1067
                            != 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1068
                        short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1069
                        switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1070
                            case NodeFilter.FILTER_REJECT :
7f561c08de6b Initial load
duke
parents:
diff changeset
  1071
                            case NodeFilter.FILTER_SKIP :
7f561c08de6b Initial load
duke
parents:
diff changeset
  1072
                                {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1073
                                    // skip the CDATA node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1074
                                    return;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1075
                                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1076
                            default :
7f561c08de6b Initial load
duke
parents:
diff changeset
  1077
                                {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1078
                                    //fall through..
7f561c08de6b Initial load
duke
parents:
diff changeset
  1079
                                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1080
                        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1081
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1082
                    startCDATA();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1083
                    characters(text);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1084
                    endCDATA();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1085
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1086
            } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1087
                // transform into a text node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1088
                characters(text);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1089
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1090
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1091
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1092
        case Node.COMMENT_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1093
            String text;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1094
7f561c08de6b Initial load
duke
parents:
diff changeset
  1095
            if ( ! _format.getOmitComments() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1096
                text = node.getNodeValue();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1097
                if ( text != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1098
7f561c08de6b Initial load
duke
parents:
diff changeset
  1099
                    if (fDOMFilter !=null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1100
                          (fDOMFilter.getWhatToShow() & NodeFilter.SHOW_COMMENT)!= 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1101
                          short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1102
                          switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1103
                              case NodeFilter.FILTER_REJECT:
7f561c08de6b Initial load
duke
parents:
diff changeset
  1104
                              case NodeFilter.FILTER_SKIP: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1105
                                  // skip the comment node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1106
                                  return;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1107
                              }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1108
                              default: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1109
                                   // fall through
7f561c08de6b Initial load
duke
parents:
diff changeset
  1110
                              }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1111
                          }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1112
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1113
                    comment( text );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1114
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1115
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1116
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1117
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1118
7f561c08de6b Initial load
duke
parents:
diff changeset
  1119
        case Node.ENTITY_REFERENCE_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1120
            Node         child;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1121
7f561c08de6b Initial load
duke
parents:
diff changeset
  1122
            endCDATA();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1123
            content();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1124
7f561c08de6b Initial load
duke
parents:
diff changeset
  1125
            if (((features & DOMSerializerImpl.ENTITIES) != 0)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1126
                || (node.getFirstChild() == null)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1127
                if (fDOMFilter !=null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1128
                      (fDOMFilter.getWhatToShow() & NodeFilter.SHOW_ENTITY_REFERENCE)!= 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1129
                      short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1130
                      switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1131
                        case NodeFilter.FILTER_REJECT:{
7f561c08de6b Initial load
duke
parents:
diff changeset
  1132
                            return; // remove the node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1133
                          }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1134
                          case NodeFilter.FILTER_SKIP: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1135
                              child = node.getFirstChild();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1136
                              while ( child != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1137
                                  serializeNode( child );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1138
                                  child = child.getNextSibling();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1139
                              }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1140
                              return;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1141
                          }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1142
7f561c08de6b Initial load
duke
parents:
diff changeset
  1143
                          default: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1144
                               // fall through
7f561c08de6b Initial load
duke
parents:
diff changeset
  1145
                          }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1146
                      }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1147
                  }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1148
                checkUnboundNamespacePrefixedNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1149
7f561c08de6b Initial load
duke
parents:
diff changeset
  1150
                _printer.printText("&");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1151
                _printer.printText(node.getNodeName());
7f561c08de6b Initial load
duke
parents:
diff changeset
  1152
                _printer.printText(";");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1153
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1154
            else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1155
                child = node.getFirstChild();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1156
                while ( child != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1157
                    serializeNode( child );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1158
                    child = child.getNextSibling();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1159
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1160
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1161
7f561c08de6b Initial load
duke
parents:
diff changeset
  1162
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1163
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1164
7f561c08de6b Initial load
duke
parents:
diff changeset
  1165
        case Node.PROCESSING_INSTRUCTION_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1166
7f561c08de6b Initial load
duke
parents:
diff changeset
  1167
            if (fDOMFilter !=null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1168
                  (fDOMFilter.getWhatToShow() & NodeFilter.SHOW_PROCESSING_INSTRUCTION)!= 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1169
                  short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1170
                  switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1171
                    case NodeFilter.FILTER_REJECT:
7f561c08de6b Initial load
duke
parents:
diff changeset
  1172
                    case NodeFilter.FILTER_SKIP: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1173
                          return;  // skip this node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1174
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1175
                    default: { // fall through
7f561c08de6b Initial load
duke
parents:
diff changeset
  1176
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1177
                  }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1178
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1179
            processingInstructionIO( node.getNodeName(), node.getNodeValue() );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1180
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1181
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1182
        case Node.ELEMENT_NODE :  {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1183
7f561c08de6b Initial load
duke
parents:
diff changeset
  1184
            if (fDOMFilter !=null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1185
                  (fDOMFilter.getWhatToShow() & NodeFilter.SHOW_ELEMENT)!= 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1186
                  short code = fDOMFilter.acceptNode(node);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1187
                  switch (code) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1188
                    case NodeFilter.FILTER_REJECT: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1189
                        return;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1190
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1191
                    case NodeFilter.FILTER_SKIP: {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1192
                        Node child = node.getFirstChild();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1193
                        while ( child != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1194
                            serializeNode( child );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1195
                            child = child.getNextSibling();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1196
                        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1197
                        return;  // skip this node
7f561c08de6b Initial load
duke
parents:
diff changeset
  1198
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1199
7f561c08de6b Initial load
duke
parents:
diff changeset
  1200
                    default: { // fall through
7f561c08de6b Initial load
duke
parents:
diff changeset
  1201
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1202
                  }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1203
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1204
            serializeElement( (Element) node );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1205
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1206
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1207
        case Node.DOCUMENT_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1208
            DocumentType      docType;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1209
7f561c08de6b Initial load
duke
parents:
diff changeset
  1210
            serializeDocument();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1211
7f561c08de6b Initial load
duke
parents:
diff changeset
  1212
            // If there is a document type, use the SAX events to
7f561c08de6b Initial load
duke
parents:
diff changeset
  1213
            // serialize it.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1214
            docType = ( (Document) node ).getDoctype();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1215
            if (docType != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1216
                // DOM Level 2 (or higher)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1217
                try {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1218
                    String internal;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1219
7f561c08de6b Initial load
duke
parents:
diff changeset
  1220
                    _printer.enterDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1221
                    _docTypePublicId = docType.getPublicId();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1222
                    _docTypeSystemId = docType.getSystemId();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1223
                    internal = docType.getInternalSubset();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1224
                    if ( internal != null && internal.length() > 0 )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1225
                        _printer.printText( internal );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1226
                    endDTD();
31497
4a6b2e733c0d 8130051: Cleanup usage of reflection in jaxp
dfuchs
parents: 25868
diff changeset
  1227
                } catch (Exception e) {
4a6b2e733c0d 8130051: Cleanup usage of reflection in jaxp
dfuchs
parents: 25868
diff changeset
  1228
                    // ignore
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1229
                    _printer.enterDTD();
31497
4a6b2e733c0d 8130051: Cleanup usage of reflection in jaxp
dfuchs
parents: 25868
diff changeset
  1230
                    _docTypePublicId = null;
4a6b2e733c0d 8130051: Cleanup usage of reflection in jaxp
dfuchs
parents: 25868
diff changeset
  1231
                    _docTypeSystemId = null;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1232
                    endDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1233
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1234
                serializeDTD(docType.getName());
7f561c08de6b Initial load
duke
parents:
diff changeset
  1235
7f561c08de6b Initial load
duke
parents:
diff changeset
  1236
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1237
            _started = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1238
7f561c08de6b Initial load
duke
parents:
diff changeset
  1239
            // !! Fall through
7f561c08de6b Initial load
duke
parents:
diff changeset
  1240
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1241
        case Node.DOCUMENT_FRAGMENT_NODE : {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1242
            Node         child;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1243
7f561c08de6b Initial load
duke
parents:
diff changeset
  1244
            // By definition this will happen if the node is a document,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1245
            // document fragment, etc. Just serialize its contents. It will
7f561c08de6b Initial load
duke
parents:
diff changeset
  1246
            // work well for other nodes that we do not know how to serialize.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1247
            child = node.getFirstChild();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1248
            while ( child != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1249
                serializeNode( child );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1250
                child = child.getNextSibling();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1251
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1252
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1253
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1254
7f561c08de6b Initial load
duke
parents:
diff changeset
  1255
        default:
7f561c08de6b Initial load
duke
parents:
diff changeset
  1256
            break;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1257
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1258
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1259
7f561c08de6b Initial load
duke
parents:
diff changeset
  1260
7f561c08de6b Initial load
duke
parents:
diff changeset
  1261
    /* Serializes XML Declaration, according to 'xml-declaration' property.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1262
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1263
    protected void serializeDocument()throws IOException {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1264
        int    i;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1265
7f561c08de6b Initial load
duke
parents:
diff changeset
  1266
        String dtd = _printer.leaveDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1267
        if (! _started) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1268
7f561c08de6b Initial load
duke
parents:
diff changeset
  1269
            if (! _format.getOmitXMLDeclaration()) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1270
                StringBuffer    buffer;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1271
7f561c08de6b Initial load
duke
parents:
diff changeset
  1272
                // Serialize the document declaration appreaing at the head
7f561c08de6b Initial load
duke
parents:
diff changeset
  1273
                // of very XML document (unless asked not to).
7f561c08de6b Initial load
duke
parents:
diff changeset
  1274
                buffer = new StringBuffer( "<?xml version=\"" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1275
                if (_format.getVersion() != null)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1276
                    buffer.append( _format.getVersion() );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1277
                else
7f561c08de6b Initial load
duke
parents:
diff changeset
  1278
                    buffer.append( "1.0" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1279
                buffer.append( '"' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1280
                String format_encoding =  _format.getEncoding();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1281
                if (format_encoding != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1282
                    buffer.append( " encoding=\"" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1283
                    buffer.append( format_encoding );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1284
                    buffer.append( '"' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1285
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1286
                if (_format.getStandalone() && _docTypeSystemId == null &&
7f561c08de6b Initial load
duke
parents:
diff changeset
  1287
                    _docTypePublicId == null)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1288
                    buffer.append( " standalone=\"yes\"" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1289
                buffer.append( "?>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1290
                _printer.printText( buffer );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1291
                _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1292
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1293
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1294
7f561c08de6b Initial load
duke
parents:
diff changeset
  1295
        // Always serialize these, even if not te first root element.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1296
        serializePreRoot();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1297
7f561c08de6b Initial load
duke
parents:
diff changeset
  1298
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1299
7f561c08de6b Initial load
duke
parents:
diff changeset
  1300
    /* Serializes DTD, if present.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1301
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1302
    protected void serializeDTD(String name) throws IOException{
7f561c08de6b Initial load
duke
parents:
diff changeset
  1303
7f561c08de6b Initial load
duke
parents:
diff changeset
  1304
        String dtd = _printer.leaveDTD();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1305
        if (! _format.getOmitDocumentType()) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1306
            if (_docTypeSystemId != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1307
                // System identifier must be specified to print DOCTYPE.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1308
                // If public identifier is specified print 'PUBLIC
7f561c08de6b Initial load
duke
parents:
diff changeset
  1309
                // <public> <system>', if not, print 'SYSTEM <system>'.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1310
                _printer.printText( "<!DOCTYPE " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1311
                _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1312
                if (_docTypePublicId != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1313
                    _printer.printText( " PUBLIC " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1314
                    printDoctypeURL( _docTypePublicId );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1315
                    if (_indenting) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1316
                        _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1317
                        for (int i = 0 ; i < 18 + name.length() ; ++i)
7f561c08de6b Initial load
duke
parents:
diff changeset
  1318
                            _printer.printText( " " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1319
                    } else
7f561c08de6b Initial load
duke
parents:
diff changeset
  1320
                        _printer.printText( " " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1321
                    printDoctypeURL( _docTypeSystemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1322
                } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1323
                    _printer.printText( " SYSTEM " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1324
                    printDoctypeURL( _docTypeSystemId );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1325
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1326
7f561c08de6b Initial load
duke
parents:
diff changeset
  1327
                // If we accumulated any DTD contents while printing.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1328
                // this would be the place to print it.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1329
                if (dtd != null && dtd.length() > 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1330
                    _printer.printText( " [" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1331
                    printText( dtd, true, true );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1332
                    _printer.printText( ']' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1333
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1334
7f561c08de6b Initial load
duke
parents:
diff changeset
  1335
                _printer.printText( ">" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1336
                _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1337
            } else if (dtd != null && dtd.length() > 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1338
                _printer.printText( "<!DOCTYPE " );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1339
                _printer.printText( name );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1340
                _printer.printText( " [" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1341
                printText( dtd, true, true );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1342
                _printer.printText( "]>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1343
                _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1344
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1345
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1346
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1347
7f561c08de6b Initial load
duke
parents:
diff changeset
  1348
7f561c08de6b Initial load
duke
parents:
diff changeset
  1349
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1350
     * Must be called by a method about to print any type of content.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1351
     * If the element was just opened, the opening tag is closed and
7f561c08de6b Initial load
duke
parents:
diff changeset
  1352
     * will be matched to a closing tag. Returns the current element
7f561c08de6b Initial load
duke
parents:
diff changeset
  1353
     * state with <tt>empty</tt> and <tt>afterElement</tt> set to false.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1354
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1355
     * @return The current element state
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1356
     * @throws IOException An I/O exception occurred while
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1357
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1358
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1359
    protected ElementState content()
7f561c08de6b Initial load
duke
parents:
diff changeset
  1360
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1361
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1362
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1363
7f561c08de6b Initial load
duke
parents:
diff changeset
  1364
        state = getElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1365
        if ( ! isDocumentState() ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1366
            // Need to close CData section first
7f561c08de6b Initial load
duke
parents:
diff changeset
  1367
            if ( state.inCData && ! state.doCData ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1368
                _printer.printText( "]]>" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1369
                state.inCData = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1370
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1371
            // If this is the first content in the element,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1372
            // change the state to not-empty and close the
7f561c08de6b Initial load
duke
parents:
diff changeset
  1373
            // opening element tag.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1374
            if ( state.empty ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1375
                _printer.printText( '>' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1376
                state.empty = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1377
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1378
            // Except for one content type, all of them
7f561c08de6b Initial load
duke
parents:
diff changeset
  1379
            // are not last element. That one content
7f561c08de6b Initial load
duke
parents:
diff changeset
  1380
            // type will take care of itself.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1381
            state.afterElement = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1382
            // Except for one content type, all of them
7f561c08de6b Initial load
duke
parents:
diff changeset
  1383
            // are not last comment. That one content
7f561c08de6b Initial load
duke
parents:
diff changeset
  1384
            // type will take care of itself.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1385
            state.afterComment = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1386
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1387
        return state;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1388
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1389
7f561c08de6b Initial load
duke
parents:
diff changeset
  1390
7f561c08de6b Initial load
duke
parents:
diff changeset
  1391
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1392
     * Called to print the text contents in the prevailing element format.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1393
     * Since this method is capable of printing text as CDATA, it is used
7f561c08de6b Initial load
duke
parents:
diff changeset
  1394
     * for that purpose as well. White space handling is determined by the
7f561c08de6b Initial load
duke
parents:
diff changeset
  1395
     * current element state. In addition, the output format can dictate
7f561c08de6b Initial load
duke
parents:
diff changeset
  1396
     * whether the text is printed as CDATA or unescaped.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1397
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1398
     * @param text The text to print
7f561c08de6b Initial load
duke
parents:
diff changeset
  1399
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
  1400
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1401
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1402
    protected void characters( String text )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1403
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1404
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1405
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1406
7f561c08de6b Initial load
duke
parents:
diff changeset
  1407
        state = content();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1408
        // Check if text should be print as CDATA section or unescaped
7f561c08de6b Initial load
duke
parents:
diff changeset
  1409
        // based on elements listed in the output format (the element
7f561c08de6b Initial load
duke
parents:
diff changeset
  1410
        // state) or whether we are inside a CDATA section or entity.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1411
7f561c08de6b Initial load
duke
parents:
diff changeset
  1412
        if ( state.inCData || state.doCData ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1413
            // Print a CDATA section. The text is not escaped, but ']]>'
7f561c08de6b Initial load
duke
parents:
diff changeset
  1414
            // appearing in the code must be identified and dealt with.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1415
            // The contents of a text node is considered space preserving.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1416
            if ( ! state.inCData ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1417
                _printer.printText("<![CDATA[");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1418
                state.inCData = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1419
            }
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1420
            int saveIndent = _printer.getNextIndent();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1421
            _printer.setNextIndent( 0 );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1422
            printCDATAText( text);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1423
            _printer.setNextIndent( saveIndent );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1424
7f561c08de6b Initial load
duke
parents:
diff changeset
  1425
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1426
7f561c08de6b Initial load
duke
parents:
diff changeset
  1427
            int saveIndent;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1428
7f561c08de6b Initial load
duke
parents:
diff changeset
  1429
            if ( state.preserveSpace ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1430
                // If preserving space then hold of indentation so no
7f561c08de6b Initial load
duke
parents:
diff changeset
  1431
                // excessive spaces are printed at line breaks, escape
7f561c08de6b Initial load
duke
parents:
diff changeset
  1432
                // the text content without replacing spaces and print
7f561c08de6b Initial load
duke
parents:
diff changeset
  1433
                // the text breaking only at line breaks.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1434
                saveIndent = _printer.getNextIndent();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1435
                _printer.setNextIndent( 0 );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1436
                printText( text, true, state.unescaped );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1437
                _printer.setNextIndent( saveIndent );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1438
            } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1439
                printText( text, false, state.unescaped );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1440
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1441
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1442
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1443
7f561c08de6b Initial load
duke
parents:
diff changeset
  1444
7f561c08de6b Initial load
duke
parents:
diff changeset
  1445
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1446
     * Returns the suitable entity reference for this character value,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1447
     * or null if no such entity exists. Calling this method with <tt>'&amp;'</tt>
7f561c08de6b Initial load
duke
parents:
diff changeset
  1448
     * will return <tt>"&amp;amp;"</tt>.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1449
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1450
     * @param ch Character value
7f561c08de6b Initial load
duke
parents:
diff changeset
  1451
     * @return Character entity name, or null
7f561c08de6b Initial load
duke
parents:
diff changeset
  1452
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1453
    protected abstract String getEntityRef( int ch );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1454
7f561c08de6b Initial load
duke
parents:
diff changeset
  1455
7f561c08de6b Initial load
duke
parents:
diff changeset
  1456
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1457
     * Called to serializee the DOM element. The element is serialized based on
7f561c08de6b Initial load
duke
parents:
diff changeset
  1458
     * the serializer's method (XML, HTML, XHTML).
7f561c08de6b Initial load
duke
parents:
diff changeset
  1459
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1460
     * @param elem The element to serialize
7f561c08de6b Initial load
duke
parents:
diff changeset
  1461
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
  1462
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1463
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1464
    protected abstract void serializeElement( Element elem )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1465
        throws IOException;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1466
7f561c08de6b Initial load
duke
parents:
diff changeset
  1467
7f561c08de6b Initial load
duke
parents:
diff changeset
  1468
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1469
     * Comments and PIs cannot be serialized before the root element,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1470
     * because the root element serializes the document type, which
7f561c08de6b Initial load
duke
parents:
diff changeset
  1471
     * generally comes first. Instead such PIs and comments are
7f561c08de6b Initial load
duke
parents:
diff changeset
  1472
     * accumulated inside a vector and serialized by calling this
7f561c08de6b Initial load
duke
parents:
diff changeset
  1473
     * method. Will be called when the root element is serialized
7f561c08de6b Initial load
duke
parents:
diff changeset
  1474
     * and when the document finished serializing.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1475
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1476
     * @throws IOException An I/O exception occured while
7f561c08de6b Initial load
duke
parents:
diff changeset
  1477
     *   serializing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1478
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1479
    protected void serializePreRoot()
7f561c08de6b Initial load
duke
parents:
diff changeset
  1480
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1481
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1482
        int i;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1483
7f561c08de6b Initial load
duke
parents:
diff changeset
  1484
        if ( _preRoot != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1485
            for ( i = 0 ; i < _preRoot.size() ; ++i ) {
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
  1486
                printText(_preRoot.get( i ), true, true );
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1487
                if ( _indenting )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1488
                _printer.breakLine();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1489
            }
47359
e1a6c0168741 8181150: Fix lint warnings in JAXP repo: rawtypes and unchecked
joehw
parents: 47216
diff changeset
  1490
            _preRoot.clear();
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1491
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1492
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1493
7f561c08de6b Initial load
duke
parents:
diff changeset
  1494
7f561c08de6b Initial load
duke
parents:
diff changeset
  1495
    //---------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1496
    // Text pretty printing and formatting methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
  1497
    //---------------------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1498
7f561c08de6b Initial load
duke
parents:
diff changeset
  1499
    protected void printCDATAText( String text ) throws IOException {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1500
        int length = text.length();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1501
        char ch;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1502
7f561c08de6b Initial load
duke
parents:
diff changeset
  1503
        for ( int index = 0 ; index <  length; ++index ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1504
            ch = text.charAt( index );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1505
            if (ch == ']'
7f561c08de6b Initial load
duke
parents:
diff changeset
  1506
                && index + 2 < length
7f561c08de6b Initial load
duke
parents:
diff changeset
  1507
                && text.charAt(index + 1) == ']'
7f561c08de6b Initial load
duke
parents:
diff changeset
  1508
                && text.charAt(index + 2) == '>') { // check for ']]>'
7f561c08de6b Initial load
duke
parents:
diff changeset
  1509
                if (fDOMErrorHandler != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1510
                    // REVISIT: this means that if DOM Error handler is not registered we don't report any
7f561c08de6b Initial load
duke
parents:
diff changeset
  1511
                    // fatal errors and might serialize not wellformed document
7f561c08de6b Initial load
duke
parents:
diff changeset
  1512
                    if ((features & DOMSerializerImpl.SPLITCDATA) == 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1513
                        String msg = DOMMessageFormatter.formatMessage(
7f561c08de6b Initial load
duke
parents:
diff changeset
  1514
                            DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1515
                            "EndingCDATA",
7f561c08de6b Initial load
duke
parents:
diff changeset
  1516
                            null);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1517
                        if ((features & DOMSerializerImpl.WELLFORMED) != 0) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1518
                            // issue fatal error
7f561c08de6b Initial load
duke
parents:
diff changeset
  1519
                            modifyDOMError(msg, DOMError.SEVERITY_FATAL_ERROR, "wf-invalid-character", fCurrentNode);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1520
                            fDOMErrorHandler.handleError(fDOMError);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1521
                            throw new LSException(LSException.SERIALIZE_ERR, msg);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1522
                        }
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1523
                        // issue error
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1524
                        modifyDOMError(msg, DOMError.SEVERITY_ERROR, "cdata-section-not-splitted", fCurrentNode);
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1525
                        if (!fDOMErrorHandler.handleError(fDOMError)) {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1526
                            throw new LSException(LSException.SERIALIZE_ERR, msg);
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1527
                        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1528
                    } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1529
                        // issue warning
7f561c08de6b Initial load
duke
parents:
diff changeset
  1530
                        String msg =
7f561c08de6b Initial load
duke
parents:
diff changeset
  1531
                            DOMMessageFormatter.formatMessage(
7f561c08de6b Initial load
duke
parents:
diff changeset
  1532
                                DOMMessageFormatter.SERIALIZER_DOMAIN,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1533
                                "SplittingCDATA",
7f561c08de6b Initial load
duke
parents:
diff changeset
  1534
                                null);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1535
                        modifyDOMError(
7f561c08de6b Initial load
duke
parents:
diff changeset
  1536
                            msg,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1537
                            DOMError.SEVERITY_WARNING,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1538
                            null, fCurrentNode);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1539
                        fDOMErrorHandler.handleError(fDOMError);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1540
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1541
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1542
                // split CDATA section
7f561c08de6b Initial load
duke
parents:
diff changeset
  1543
                _printer.printText("]]]]><![CDATA[>");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1544
                index += 2;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1545
                continue;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1546
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1547
7f561c08de6b Initial load
duke
parents:
diff changeset
  1548
            if (!XMLChar.isValid(ch)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1549
                // check if it is surrogate
7f561c08de6b Initial load
duke
parents:
diff changeset
  1550
                if (++index <length) {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1551
                    surrogates(ch, text.charAt(index),true);
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1552
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1553
                else {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1554
                    fatalError("The character '"+ch+"' is an invalid XML character");
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1555
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1556
                continue;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1557
            }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1558
            if ( ( ch >= ' ' && _encodingInfo.isPrintable(ch) && ch != 0x7F ) ||
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1559
                 ch == '\n' || ch == '\r' || ch == '\t' ) {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1560
                _printer.printText(ch);
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1561
            }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1562
            else {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1563
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1564
                // The character is not printable -- split CDATA section
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1565
                _printer.printText("]]>&#x");
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1566
                _printer.printText(Integer.toHexString(ch));
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1567
                _printer.printText(";<![CDATA[");
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1568
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1569
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1570
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1571
7f561c08de6b Initial load
duke
parents:
diff changeset
  1572
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1573
    protected void surrogates(int high, int low, boolean inContent) throws IOException{
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1574
        if (XMLChar.isHighSurrogate(high)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1575
            if (!XMLChar.isLowSurrogate(low)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1576
                //Invalid XML
7f561c08de6b Initial load
duke
parents:
diff changeset
  1577
                fatalError("The character '"+(char)low+"' is an invalid XML character");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1578
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1579
            else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1580
                int supplemental = XMLChar.supplemental((char)high, (char)low);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1581
                if (!XMLChar.isValid(supplemental)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1582
                    //Invalid XML
7f561c08de6b Initial load
duke
parents:
diff changeset
  1583
                    fatalError("The character '"+(char)supplemental+"' is an invalid XML character");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1584
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1585
                else {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1586
                    if (inContent && content().inCData) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1587
                        _printer.printText("]]>&#x");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1588
                        _printer.printText(Integer.toHexString(supplemental));
7f561c08de6b Initial load
duke
parents:
diff changeset
  1589
                        _printer.printText(";<![CDATA[");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1590
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1591
                    else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1592
                        printHex(supplemental);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1593
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1594
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1595
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1596
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1597
            fatalError("The character '"+(char)high+"' is an invalid XML character");
7f561c08de6b Initial load
duke
parents:
diff changeset
  1598
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1599
7f561c08de6b Initial load
duke
parents:
diff changeset
  1600
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1601
7f561c08de6b Initial load
duke
parents:
diff changeset
  1602
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1603
     * Called to print additional text with whitespace handling.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1604
     * If spaces are preserved, the text is printed as if by calling
7f561c08de6b Initial load
duke
parents:
diff changeset
  1605
     * {@link #printText(String,boolean,boolean)} with a call to {@link Printer#breakLine}
7f561c08de6b Initial load
duke
parents:
diff changeset
  1606
     * for each new line. If spaces are not preserved, the text is
7f561c08de6b Initial load
duke
parents:
diff changeset
  1607
     * broken at space boundaries if longer than the line width;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1608
     * Multiple spaces are printed as such, but spaces at beginning
7f561c08de6b Initial load
duke
parents:
diff changeset
  1609
     * of line are removed.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1610
     *
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1611
     * @param chars The text to print
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1612
     * @param start The start offset
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1613
     * @param length The number of characters
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1614
     * @param preserveSpace Space preserving flag
7f561c08de6b Initial load
duke
parents:
diff changeset
  1615
     * @param unescaped Print unescaped
7f561c08de6b Initial load
duke
parents:
diff changeset
  1616
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1617
    protected void printText( char[] chars, int start, int length,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1618
                                    boolean preserveSpace, boolean unescaped )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1619
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1620
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1621
7f561c08de6b Initial load
duke
parents:
diff changeset
  1622
        if ( preserveSpace ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1623
            // Preserving spaces: the text must print exactly as it is,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1624
            // without breaking when spaces appear in the text and without
7f561c08de6b Initial load
duke
parents:
diff changeset
  1625
            // consolidating spaces. If a line terminator is used, a line
7f561c08de6b Initial load
duke
parents:
diff changeset
  1626
            // break will occur.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1627
            while ( length-- > 0 ) {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1628
                char ch = chars[ start ];
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1629
                ++start;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1630
                if ( ch == '\n' || ch == '\r' || unescaped ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1631
                    _printer.printText( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1632
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1633
                else {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1634
                    printEscaped( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1635
                }
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1636
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1637
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1638
            // Not preserving spaces: print one part at a time, and
7f561c08de6b Initial load
duke
parents:
diff changeset
  1639
            // use spaces between parts to break them into different
7f561c08de6b Initial load
duke
parents:
diff changeset
  1640
            // lines. Spaces at beginning of line will be stripped
7f561c08de6b Initial load
duke
parents:
diff changeset
  1641
            // by printing mechanism. Line terminator is treated
7f561c08de6b Initial load
duke
parents:
diff changeset
  1642
            // no different than other text part.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1643
            while ( length-- > 0 ) {
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1644
                char ch = chars[ start ];
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1645
                ++start;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1646
                if ( ch == ' ' || ch == '\f' || ch == '\t' || ch == '\n' || ch == '\r' ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1647
                    _printer.printSpace();
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1648
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1649
                else if ( unescaped ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1650
                    _printer.printText( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1651
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1652
                else {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1653
                    printEscaped( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1654
                }
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1655
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1656
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1657
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1658
7f561c08de6b Initial load
duke
parents:
diff changeset
  1659
7f561c08de6b Initial load
duke
parents:
diff changeset
  1660
    protected void printText( String text, boolean preserveSpace, boolean unescaped )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1661
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1662
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1663
        int index;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1664
        char ch;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1665
7f561c08de6b Initial load
duke
parents:
diff changeset
  1666
        if ( preserveSpace ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1667
            // Preserving spaces: the text must print exactly as it is,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1668
            // without breaking when spaces appear in the text and without
7f561c08de6b Initial load
duke
parents:
diff changeset
  1669
            // consolidating spaces. If a line terminator is used, a line
7f561c08de6b Initial load
duke
parents:
diff changeset
  1670
            // break will occur.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1671
            for ( index = 0 ; index < text.length() ; ++index ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1672
                ch = text.charAt( index );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1673
                if ( ch == '\n' || ch == '\r' || unescaped )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1674
                    _printer.printText( ch );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1675
                else
7f561c08de6b Initial load
duke
parents:
diff changeset
  1676
                    printEscaped( ch );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1677
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1678
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1679
            // Not preserving spaces: print one part at a time, and
7f561c08de6b Initial load
duke
parents:
diff changeset
  1680
            // use spaces between parts to break them into different
7f561c08de6b Initial load
duke
parents:
diff changeset
  1681
            // lines. Spaces at beginning of line will be stripped
7f561c08de6b Initial load
duke
parents:
diff changeset
  1682
            // by printing mechanism. Line terminator is treated
7f561c08de6b Initial load
duke
parents:
diff changeset
  1683
            // no different than other text part.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1684
            for ( index = 0 ; index < text.length() ; ++index ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1685
                ch = text.charAt( index );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1686
                if ( ch == ' ' || ch == '\f' || ch == '\t' || ch == '\n' || ch == '\r' ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1687
                    _printer.printSpace();
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1688
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1689
                else if ( unescaped ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1690
                    _printer.printText( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1691
                }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1692
                else {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1693
                    printEscaped( ch );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1694
                }
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1695
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1696
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1697
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1698
7f561c08de6b Initial load
duke
parents:
diff changeset
  1699
7f561c08de6b Initial load
duke
parents:
diff changeset
  1700
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1701
     * Print a document type public or system identifier URL.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1702
     * Encapsulates the URL in double quotes, escapes non-printing
7f561c08de6b Initial load
duke
parents:
diff changeset
  1703
     * characters and print it equivalent to {@link #printText}.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1704
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1705
     * @param url The document type url to print
7f561c08de6b Initial load
duke
parents:
diff changeset
  1706
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1707
    protected void printDoctypeURL( String url )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1708
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1709
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1710
        int                i;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1711
7f561c08de6b Initial load
duke
parents:
diff changeset
  1712
        _printer.printText( '"' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1713
        for( i = 0 ; i < url.length() ; ++i ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1714
            if ( url.charAt( i ) == '"' ||  url.charAt( i ) < 0x20 || url.charAt( i ) > 0x7F ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1715
                _printer.printText( '%' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1716
                _printer.printText( Integer.toHexString( url.charAt( i ) ) );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1717
            } else
7f561c08de6b Initial load
duke
parents:
diff changeset
  1718
                _printer.printText( url.charAt( i ) );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1719
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1720
        _printer.printText( '"' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1721
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1722
7f561c08de6b Initial load
duke
parents:
diff changeset
  1723
7f561c08de6b Initial load
duke
parents:
diff changeset
  1724
    protected void printEscaped( int ch )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1725
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1726
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1727
        String charRef;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1728
        // If there is a suitable entity reference for this
7f561c08de6b Initial load
duke
parents:
diff changeset
  1729
        // character, print it. The list of available entity
7f561c08de6b Initial load
duke
parents:
diff changeset
  1730
        // references is almost but not identical between
7f561c08de6b Initial load
duke
parents:
diff changeset
  1731
        // XML and HTML.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1732
        charRef = getEntityRef( ch );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1733
        if ( charRef != null ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1734
            _printer.printText( '&' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1735
            _printer.printText( charRef );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1736
            _printer.printText( ';' );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1737
        } else if ( ( ch >= ' ' && _encodingInfo.isPrintable((char)ch) && ch != 0x7F ) ||
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1738
                    ch == '\n' || ch == '\r' || ch == '\t' ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1739
            // Non printables are below ASCII space but not tab or line
7f561c08de6b Initial load
duke
parents:
diff changeset
  1740
            // terminator, ASCII delete, or above a certain Unicode threshold.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1741
            if (ch < 0x10000) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1742
                _printer.printText((char)ch );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1743
            } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1744
                _printer.printText((char)(((ch-0x10000)>>10)+0xd800));
7f561c08de6b Initial load
duke
parents:
diff changeset
  1745
                _printer.printText((char)(((ch-0x10000)&0x3ff)+0xdc00));
7f561c08de6b Initial load
duke
parents:
diff changeset
  1746
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1747
        } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1748
                        printHex(ch);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1749
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1750
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1751
7f561c08de6b Initial load
duke
parents:
diff changeset
  1752
        /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1753
         * Escapes chars
7f561c08de6b Initial load
duke
parents:
diff changeset
  1754
         */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1755
         final void printHex( int ch) throws IOException {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1756
                 _printer.printText( "&#x" );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1757
                 _printer.printText(Integer.toHexString(ch));
7f561c08de6b Initial load
duke
parents:
diff changeset
  1758
                 _printer.printText( ';' );
7f561c08de6b Initial load
duke
parents:
diff changeset
  1759
7f561c08de6b Initial load
duke
parents:
diff changeset
  1760
         }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1761
7f561c08de6b Initial load
duke
parents:
diff changeset
  1762
7f561c08de6b Initial load
duke
parents:
diff changeset
  1763
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1764
     * Escapes a string so it may be printed as text content or attribute
7f561c08de6b Initial load
duke
parents:
diff changeset
  1765
     * value. Non printable characters are escaped using character references.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1766
     * Where the format specifies a deault entity reference, that reference
7f561c08de6b Initial load
duke
parents:
diff changeset
  1767
     * is used (e.g. <tt>&amp;lt;</tt>).
7f561c08de6b Initial load
duke
parents:
diff changeset
  1768
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1769
     * @param source The string to escape
7f561c08de6b Initial load
duke
parents:
diff changeset
  1770
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1771
    protected void printEscaped( String source )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1772
        throws IOException
7f561c08de6b Initial load
duke
parents:
diff changeset
  1773
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1774
        for ( int i = 0 ; i < source.length() ; ++i ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1775
            int ch = source.charAt(i);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1776
            if ((ch & 0xfc00) == 0xd800 && i+1 < source.length()) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1777
                int lowch = source.charAt(i+1);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1778
                if ((lowch & 0xfc00) == 0xdc00) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1779
                    ch = 0x10000 + ((ch-0xd800)<<10) + lowch-0xdc00;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1780
                    i++;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1781
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1782
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1783
            printEscaped(ch);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1784
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1785
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1786
7f561c08de6b Initial load
duke
parents:
diff changeset
  1787
7f561c08de6b Initial load
duke
parents:
diff changeset
  1788
    //--------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1789
    // Element state handling methods //
7f561c08de6b Initial load
duke
parents:
diff changeset
  1790
    //--------------------------------//
7f561c08de6b Initial load
duke
parents:
diff changeset
  1791
7f561c08de6b Initial load
duke
parents:
diff changeset
  1792
7f561c08de6b Initial load
duke
parents:
diff changeset
  1793
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1794
     * Return the state of the current element.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1795
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1796
     * @return Current element state
7f561c08de6b Initial load
duke
parents:
diff changeset
  1797
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1798
    protected ElementState getElementState()
7f561c08de6b Initial load
duke
parents:
diff changeset
  1799
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1800
        return _elementStates[ _elementStateCount ];
7f561c08de6b Initial load
duke
parents:
diff changeset
  1801
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1802
7f561c08de6b Initial load
duke
parents:
diff changeset
  1803
7f561c08de6b Initial load
duke
parents:
diff changeset
  1804
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1805
     * Enter a new element state for the specified element.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1806
     * Tag name and space preserving is specified, element
7f561c08de6b Initial load
duke
parents:
diff changeset
  1807
     * state is initially empty.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1808
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1809
     * @return Current element state, or null
7f561c08de6b Initial load
duke
parents:
diff changeset
  1810
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1811
    protected ElementState enterElementState( String namespaceURI, String localName,
7f561c08de6b Initial load
duke
parents:
diff changeset
  1812
                                              String rawName, boolean preserveSpace )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1813
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1814
        ElementState state;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1815
7f561c08de6b Initial load
duke
parents:
diff changeset
  1816
        if ( _elementStateCount + 1 == _elementStates.length ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1817
            ElementState[] newStates;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1818
7f561c08de6b Initial load
duke
parents:
diff changeset
  1819
            // Need to create a larger array of states. This does not happen
7f561c08de6b Initial load
duke
parents:
diff changeset
  1820
            // often, unless the document is really deep.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1821
            newStates = new ElementState[ _elementStates.length + 10 ];
7f561c08de6b Initial load
duke
parents:
diff changeset
  1822
            for ( int i = 0 ; i < _elementStates.length ; ++i )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1823
                newStates[ i ] = _elementStates[ i ];
7f561c08de6b Initial load
duke
parents:
diff changeset
  1824
            for ( int i = _elementStates.length ; i < newStates.length ; ++i )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1825
                newStates[ i ] = new ElementState();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1826
            _elementStates = newStates;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1827
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1828
7f561c08de6b Initial load
duke
parents:
diff changeset
  1829
        ++_elementStateCount;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1830
        state = _elementStates[ _elementStateCount ];
7f561c08de6b Initial load
duke
parents:
diff changeset
  1831
        state.namespaceURI = namespaceURI;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1832
        state.localName = localName;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1833
        state.rawName = rawName;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1834
        state.preserveSpace = preserveSpace;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1835
        state.empty = true;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1836
        state.afterElement = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1837
        state.afterComment = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1838
        state.doCData = state.inCData = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1839
        state.unescaped = false;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1840
        state.prefixes = _prefixes;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1841
7f561c08de6b Initial load
duke
parents:
diff changeset
  1842
        _prefixes = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1843
        return state;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1844
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1845
7f561c08de6b Initial load
duke
parents:
diff changeset
  1846
7f561c08de6b Initial load
duke
parents:
diff changeset
  1847
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1848
     * Leave the current element state and return to the
7f561c08de6b Initial load
duke
parents:
diff changeset
  1849
     * state of the parent element. If this was the root
7f561c08de6b Initial load
duke
parents:
diff changeset
  1850
     * element, return to the state of the document.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1851
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1852
     * @return Previous element state
7f561c08de6b Initial load
duke
parents:
diff changeset
  1853
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1854
    protected ElementState leaveElementState()
7f561c08de6b Initial load
duke
parents:
diff changeset
  1855
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1856
        if ( _elementStateCount > 0 ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1857
            /*Corrected by David Blondeau (blondeau@intalio.com)*/
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1858
            _prefixes = null;
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1859
            //_prefixes = _elementStates[ _elementStateCount ].prefixes;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1860
            -- _elementStateCount;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1861
            return _elementStates[ _elementStateCount ];
7f561c08de6b Initial load
duke
parents:
diff changeset
  1862
        }
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1863
        String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.SERIALIZER_DOMAIN, "Internal", null);
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1864
        throw new IllegalStateException(msg);
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1865
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1866
7f561c08de6b Initial load
duke
parents:
diff changeset
  1867
7f561c08de6b Initial load
duke
parents:
diff changeset
  1868
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1869
     * Returns true if in the state of the document.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1870
     * Returns true before entering any element and after
7f561c08de6b Initial load
duke
parents:
diff changeset
  1871
     * leaving the root element.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1872
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1873
     * @return True if in the state of the document
7f561c08de6b Initial load
duke
parents:
diff changeset
  1874
     */
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1875
    protected boolean isDocumentState() {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1876
        return _elementStateCount == 0;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1877
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1878
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1879
    /** Clears document state. **/
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1880
    final void clearDocumentState() {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1881
        _elementStateCount = 0;
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1882
    }
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1883
7f561c08de6b Initial load
duke
parents:
diff changeset
  1884
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1885
     * Returns the namespace prefix for the specified URI.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1886
     * If the URI has been mapped to a prefix, returns the
7f561c08de6b Initial load
duke
parents:
diff changeset
  1887
     * prefix, otherwise returns null.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1888
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1889
     * @param namespaceURI The namespace URI
7f561c08de6b Initial load
duke
parents:
diff changeset
  1890
     * @return The namespace prefix if known, or null
7f561c08de6b Initial load
duke
parents:
diff changeset
  1891
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1892
    protected String getPrefix( String namespaceURI )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1893
    {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1894
        String    prefix;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1895
7f561c08de6b Initial load
duke
parents:
diff changeset
  1896
        if ( _prefixes != null ) {
33349
975138b77cff 8068842: Better JAXP data handling
joehw
parents: 31497
diff changeset
  1897
            prefix = _prefixes.get( namespaceURI );
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1898
            if ( prefix != null )
7f561c08de6b Initial load
duke
parents:
diff changeset
  1899
                return prefix;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1900
        }
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1901
        if ( _elementStateCount == 0 ) {
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1902
            return null;
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1903
        }
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1904
        for ( int i = _elementStateCount ; i > 0 ; --i ) {
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1905
            if ( _elementStates[ i ].prefixes != null ) {
47712
bde0215f1f70 8181151: Fix lint warnings in JAXP repo: cast
joehw
parents: 47477
diff changeset
  1906
                prefix = _elementStates[ i ].prefixes.get( namespaceURI );
23777
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1907
                if ( prefix != null )
ce87cedb71cf 8035437: Xerces Update: xml/serialize/DOMSerializerImpl
aefimov
parents: 12457
diff changeset
  1908
                    return prefix;
6
7f561c08de6b Initial load
duke
parents:
diff changeset
  1909
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1910
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1911
        return null;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1912
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1913
7f561c08de6b Initial load
duke
parents:
diff changeset
  1914
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1915
     * The method modifies global DOM error object
7f561c08de6b Initial load
duke
parents:
diff changeset
  1916
     *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1917
     * @param message
7f561c08de6b Initial load
duke
parents:
diff changeset
  1918
     * @param severity
7f561c08de6b Initial load
duke
parents:
diff changeset
  1919
     * @param type
7f561c08de6b Initial load
duke
parents:
diff changeset
  1920
     * @return a DOMError
7f561c08de6b Initial load
duke
parents:
diff changeset
  1921
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1922
    protected DOMError modifyDOMError(String message, short severity, String type, Node node){
7f561c08de6b Initial load
duke
parents:
diff changeset
  1923
            fDOMError.reset();
7f561c08de6b Initial load
duke
parents:
diff changeset
  1924
            fDOMError.fMessage = message;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1925
            fDOMError.fType = type;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1926
            fDOMError.fSeverity = severity;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1927
            fDOMError.fLocator = new DOMLocatorImpl(-1, -1, -1, node, null);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1928
            return fDOMError;
7f561c08de6b Initial load
duke
parents:
diff changeset
  1929
7f561c08de6b Initial load
duke
parents:
diff changeset
  1930
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1931
7f561c08de6b Initial load
duke
parents:
diff changeset
  1932
7f561c08de6b Initial load
duke
parents:
diff changeset
  1933
    protected void fatalError(String message) throws IOException{
7f561c08de6b Initial load
duke
parents:
diff changeset
  1934
        if (fDOMErrorHandler != null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1935
            modifyDOMError(message, DOMError.SEVERITY_FATAL_ERROR, null, fCurrentNode);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1936
            fDOMErrorHandler.handleError(fDOMError);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1937
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1938
        else {
7f561c08de6b Initial load
duke
parents:
diff changeset
  1939
            throw new IOException(message);
7f561c08de6b Initial load
duke
parents:
diff changeset
  1940
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1941
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1942
7f561c08de6b Initial load
duke
parents:
diff changeset
  1943
        /**
7f561c08de6b Initial load
duke
parents:
diff changeset
  1944
         * DOM level 3:
7f561c08de6b Initial load
duke
parents:
diff changeset
  1945
         * Check a node to determine if it contains unbound namespace prefixes.
7f561c08de6b Initial load
duke
parents:
diff changeset
  1946
         *
7f561c08de6b Initial load
duke
parents:
diff changeset
  1947
         * @param node The node to check for unbound namespace prefices
7f561c08de6b Initial load
duke
parents:
diff changeset
  1948
         */
7f561c08de6b Initial load
duke
parents:
diff changeset
  1949
         protected void checkUnboundNamespacePrefixedNode (Node node) throws IOException{
7f561c08de6b Initial load
duke
parents:
diff changeset
  1950
7f561c08de6b Initial load
duke
parents:
diff changeset
  1951
         }
7f561c08de6b Initial load
duke
parents:
diff changeset
  1952
}