changeset 1034:13a7d93c0740

Merge
author lana
date Wed, 23 Nov 2016 19:15:33 +0000
parents f1042f0aa643 (current diff) 31ac7aab52da (diff)
children 149559dd882d
files
diffstat 38 files changed, 1588 insertions(+), 1558 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java	Wed Nov 23 19:15:33 2016 +0000
@@ -530,6 +530,10 @@
                 XMLSecurityManager.printWarning(reader.getClass().getName(), lastProperty, se);
             }
 
+            // try setting other JDK-impl properties, ignore if not supported
+            JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, JdkXmlUtils.CDATA_CHUNK_SIZE,
+                _xsltc.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE), false);
+
             return(parse(reader, input));
         }
         catch (ParserConfigurationException e) {
@@ -1342,12 +1346,14 @@
         }
         else {
             SyntaxTreeNode parent = _parentStack.peek();
+
             if (element.getClass().isAssignableFrom(Import.class) &&
                     parent.notTypeOf(Import.class)) {
                 ErrorMsg err = new ErrorMsg(ErrorMsg.IMPORT_PRECEDE_OTHERS_ERR,
                                             prefix+':'+localname);
                 throw new SAXException(err.toString());
             }
+
             parent.addElement(element);
             element.setParent(parent);
         }
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java	Wed Nov 23 19:15:33 2016 +0000
@@ -43,12 +43,14 @@
 import java.util.Objects;
 import java.util.Properties;
 import java.util.Vector;
+import java.util.jar.Attributes;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
 import javax.xml.XMLConstants;
 import javax.xml.catalog.CatalogFeatures;
 import jdk.xml.internal.JdkXmlFeatures;
+import jdk.xml.internal.JdkXmlUtils;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 
@@ -116,8 +118,8 @@
     private File    _destDir = null;     // -d <directory-name>
     private int     _outputType = FILE_OUTPUT; // by default
 
-    private Vector  _classes;
-    private Vector  _bcelClasses;
+    private ArrayList<ByteArrayOutputStream>  _classes;
+    private ArrayList<JavaClass>  _bcelClasses;
     private boolean _callsNodeset = false;
     private boolean _multiDocument = false;
     private boolean _hasIdCall = false;
@@ -160,7 +162,7 @@
     /**
     *  HashMap with the loaded classes
     */
-    private final Map<String, Class> _externalExtensionFunctions;
+    private final Map<String, Class<?>> _externalExtensionFunctions;
 
     /**
      * Catalog features
@@ -168,6 +170,11 @@
     CatalogFeatures _catalogFeatures;
 
     /**
+     * CDATA chunk size
+     */
+    int _cdataChunkSize;
+
+    /**
      * XSLTC compiler constructor
      */
     public XSLTC(boolean useServicesMechanism, JdkXmlFeatures featureManager) {
@@ -230,6 +237,8 @@
             return _extensionClassLoader;
         } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) {
             return _catalogFeatures;
+        } else if (JdkXmlUtils.CDATA_CHUNK_SIZE.equals(name)) {
+            return _cdataChunkSize;
         }
         return null;
     }
@@ -254,6 +263,8 @@
             _externalExtensionFunctions.clear();
         } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) {
             _catalogFeatures = (CatalogFeatures)value;
+        } else if (JdkXmlUtils.CDATA_CHUNK_SIZE.equals(name)) {
+            _cdataChunkSize = Integer.parseInt((String)value);
         }
     }
 
@@ -284,11 +295,11 @@
     public void init() {
         reset();
         _reader = null;
-        _classes = new Vector();
-        _bcelClasses = new Vector();
+        _classes = new ArrayList<>();
+        _bcelClasses = new ArrayList<>();
     }
 
-    private void setExternalExtensionFunctions(String name, Class clazz) {
+    private void setExternalExtensionFunctions(String name, Class<?> clazz) {
         if (_isSecureProcessing && clazz != null && !_externalExtensionFunctions.containsKey(name)) {
             _externalExtensionFunctions.put(name, clazz);
         }
@@ -319,7 +330,7 @@
      * Returns unmodifiable view of HashMap with loaded external extension
      * functions - will be needed for the TransformerImpl
     */
-    public Map<String, Class> getExternalExtensionFunctions() {
+    public Map<String, Class<?>> getExternalExtensionFunctions() {
         return Collections.unmodifiableMap(_externalExtensionFunctions);
     }
 
@@ -563,7 +574,7 @@
         final int count = _classes.size();
         final byte[][] result = new byte[count][1];
         for (int i = 0; i < count; i++)
-            result[i] = (byte[])_classes.elementAt(i);
+            result[i] = _classes.get(i).toByteArray();
         return result;
     }
 
@@ -907,7 +918,7 @@
                             getOutputFile(clazz.getClassName()))));
                 break;
             case JAR_OUTPUT:
-                _bcelClasses.addElement(clazz);
+                _bcelClasses.add(clazz);
                 break;
             case BYTEARRAY_OUTPUT:
             case BYTEARRAY_AND_FILE_OUTPUT:
@@ -915,13 +926,13 @@
             case CLASSLOADER_OUTPUT:
                 ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
                 clazz.dump(out);
-                _classes.addElement(out.toByteArray());
+                _classes.add(out);
 
                 if (_outputType == BYTEARRAY_AND_FILE_OUTPUT)
                   clazz.dump(new BufferedOutputStream(
                         new FileOutputStream(getOutputFile(clazz.getClassName()))));
                 else if (_outputType == BYTEARRAY_AND_JAR_OUTPUT)
-                  _bcelClasses.addElement(clazz);
+                  _bcelClasses.add(clazz);
 
                 break;
             }
@@ -945,30 +956,24 @@
         // create the manifest
         final Manifest manifest = new Manifest();
         final java.util.jar.Attributes atrs = manifest.getMainAttributes();
-        atrs.put(java.util.jar.Attributes.Name.MANIFEST_VERSION,"1.2");
+        atrs.put(java.util.jar.Attributes.Name.MANIFEST_VERSION, "1.2");
 
-        final Map map = manifest.getEntries();
+        final Map<String, Attributes> map = manifest.getEntries();
         // create manifest
-        Enumeration classes = _bcelClasses.elements();
         final String now = (new Date()).toString();
         final java.util.jar.Attributes.Name dateAttr =
             new java.util.jar.Attributes.Name("Date");
-        while (classes.hasMoreElements()) {
-            final JavaClass clazz = (JavaClass)classes.nextElement();
-            final String className = clazz.getClassName().replace('.','/');
-            final java.util.jar.Attributes attr = new java.util.jar.Attributes();
-            attr.put(dateAttr, now);
-            map.put(className+".class", attr);
-        }
 
         final File jarFile = new File(_destDir, _jarFileName);
         final JarOutputStream jos =
             new JarOutputStream(new FileOutputStream(jarFile), manifest);
-        classes = _bcelClasses.elements();
-        while (classes.hasMoreElements()) {
-            final JavaClass clazz = (JavaClass)classes.nextElement();
-            final String className = clazz.getClassName().replace('.','/');
-            jos.putNextEntry(new JarEntry(className+".class"));
+
+        for (JavaClass clazz : _bcelClasses) {
+            final String className = clazz.getClassName().replace('.', '/');
+            final java.util.jar.Attributes attr = new java.util.jar.Attributes();
+            attr.put(dateAttr, now);
+            map.put(className + ".class", attr);
+            jos.putNextEntry(new JarEntry(className + ".class"));
             final ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
             clazz.dump(out); // dump() closes it's output stream
             out.writeTo(jos);
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -165,14 +165,14 @@
         };
 
     static final class TransletClassLoader extends ClassLoader {
-        private final Map<String,Class> _loadedExternalExtensionFunctions;
+        private final Map<String, Class<?>> _loadedExternalExtensionFunctions;
 
          TransletClassLoader(ClassLoader parent) {
              super(parent);
             _loadedExternalExtensionFunctions = null;
         }
 
-        TransletClassLoader(ClassLoader parent,Map<String, Class> mapEF) {
+        TransletClassLoader(ClassLoader parent, Map<String, Class<?>> mapEF) {
             super(parent);
             _loadedExternalExtensionFunctions = mapEF;
         }
@@ -215,7 +215,7 @@
     /**
      * Create an XSLTC template object from the translet class definition(s).
      */
-    protected TemplatesImpl(Class[] transletClasses, String transletName,
+    protected TemplatesImpl(Class<?>[] transletClasses, String transletName,
         Properties outputProperties, int indentNumber,
         TransformerFactoryImpl tfactory)
     {
@@ -481,6 +481,7 @@
 
             // the module needs access to runtime classes
             Module thisModule = TemplatesImpl.class.getModule();
+
             Arrays.asList(Constants.PKGS_USED_BY_TRANSLET_CLASSES).forEach(p -> {
                 thisModule.addExports(p, m);
             });
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -222,7 +222,8 @@
     private boolean _useServicesMechanism;
 
     /**
-     * protocols allowed for external references set by the stylesheet processing instruction, Import and Include element.
+     * protocols allowed for external references set by the stylesheet
+     * processing instruction, Import and Include element.
      */
     private String _accessExternalStylesheet = XalanConstants.EXTERNAL_ACCESS_DEFAULT;
      /**
@@ -240,7 +241,7 @@
     // Unmodifiable view of external extension function from xslt compiler
     // It will be populated by user-specified extension functions during the
     // type checking
-    private Map<String, Class> _xsltcExtensionFunctions;
+    private Map<String, Class<?>> _xsltcExtensionFunctions;
 
     CatalogResolver _catalogUriResolver;
     CatalogFeatures _catalogFeatures;
@@ -251,6 +252,8 @@
     String _catalogPrefer = null;
     String _catalogResolve = null;
 
+    int _cdataChunkSize = JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT;
+
     /**
      * javax.xml.transform.sax.TransformerFactory implementation.
      */
@@ -283,7 +286,7 @@
         _xsltcExtensionFunctions = null;
     }
 
-    public Map<String,Class> getExternalExtensionsMap() {
+    public Map<String, Class<?>> getExternalExtensionsMap() {
         return _xsltcExtensionFunctions;
     }
 
@@ -367,6 +370,8 @@
             return _catalogResolve;
         } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) {
             return buildCatalogFeatures();
+        } else if (JdkXmlUtils.CDATA_CHUNK_SIZE.equals(name)) {
+            return _cdataChunkSize;
         }
 
         /** Check to see if the property is managed by the security manager **/
@@ -507,6 +512,9 @@
             _catalogResolve = (String) value;
             cfBuilder = CatalogFeatures.builder().with(Feature.RESOLVE, _catalogResolve);
             return;
+        } else if (JdkXmlUtils.CDATA_CHUNK_SIZE.equals(name)) {
+            _cdataChunkSize = JdkXmlUtils.getValue(value, _cdataChunkSize);
+            return;
         }
 
         if (_xmlSecurityManager != null &&
@@ -896,10 +904,10 @@
                 transletName = _packageName + "." + transletName;
 
             try {
-                final Class clazz = ObjectFactory.findProviderClass(transletName, true);
+                final Class<?> clazz = ObjectFactory.findProviderClass(transletName, true);
                 resetTransientAttributes();
 
-                templates = new TemplatesImpl(new Class[]{clazz}, transletName, null, _indentNumber, this);
+                templates = new TemplatesImpl(new Class<?>[]{clazz}, transletName, null, _indentNumber, this);
                 if (_uriResolver != null) {
                     templates.setURIResolver(_uriResolver);
                 }
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -230,6 +230,7 @@
     // Catalog is enabled by default
     boolean _useCatalog = true;
 
+    int _cdataChunkSize = JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT;
 
     /**
      * This class wraps an ErrorListener into a MessageHandler in order to
@@ -284,6 +285,9 @@
         _readerManager.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, _accessExternalDTD);
         _readerManager.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, _isSecureProcessing);
         _readerManager.setProperty(XalanConstants.SECURITY_MANAGER, _securityManager);
+        _cdataChunkSize = JdkXmlUtils.getValue(_tfactory.getAttribute(JdkXmlUtils.CDATA_CHUNK_SIZE),
+                JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
+        _readerManager.setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, _cdataChunkSize);
 
         _useCatalog = _tfactory.getFeature(XMLConstants.USE_CATALOG);
         if (_useCatalog) {
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/Util.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/Util.java	Wed Nov 23 19:15:33 2016 +0000
@@ -137,13 +137,11 @@
                     reader.setFeature
                         ("http://xml.org/sax/features/namespace-prefixes",false);
 
-                    try {
-                        reader.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD,
-                                   xsltc.getProperty(XMLConstants.ACCESS_EXTERNAL_DTD));
-                    } catch (SAXNotRecognizedException e) {
-                        XMLSecurityManager.printWarning(reader.getClass().getName(),
-                                XMLConstants.ACCESS_EXTERNAL_DTD, e);
-                    }
+                    JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, XMLConstants.ACCESS_EXTERNAL_DTD,
+                            xsltc.getProperty(XMLConstants.ACCESS_EXTERNAL_DTD), true);
+
+                    JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, JdkXmlUtils.CDATA_CHUNK_SIZE,
+                            xsltc.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE), false);
 
                     String lastProperty = "";
                     try {
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -292,7 +292,8 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
         addRecognizedProperties(recognizedProperties);
 
@@ -368,6 +369,8 @@
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
             setProperty(f.getPropertyName(), null);
         }
+
+        setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
     } // <init>(SymbolTable)
 
 
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/PropertyManager.java	Wed Nov 23 19:15:33 2016 +0000
@@ -144,6 +144,8 @@
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
             supportedProps.put(f.getPropertyName(), null);
         }
+
+        supportedProps.put(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
     }
 
     private void initWriterProps(){
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1041,14 +1041,14 @@
      *
      * @param delimiter The string that signifies the end of the character
      *                  data to be scanned.
-     * @param data      The data structure to fill.
+     * @param buffer      The data structure to fill.
+     * @param chunkLimit the size limit of the data to be scanned
      *
      * @return Returns true if there is more data to scan, false otherwise.
      *
      * @throws IOException  Thrown if i/o error occurs.
-     * @throws EOFException Thrown on end of file.
      */
-    protected boolean scanData(String delimiter, XMLStringBuffer buffer)
+    protected boolean scanData(String delimiter, XMLStringBuffer buffer, int chunkLimit)
         throws IOException {
 
         boolean done = false;
@@ -1152,82 +1152,50 @@
             }
 
             // iterate over buffer looking for delimiter
-            if (external) {
-                OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
-                    c = fCurrentEntity.ch[fCurrentEntity.position++];
-                    if (c == charAt0) {
-                        // looks like we just hit the delimiter
-                        int delimOffset = fCurrentEntity.position - 1;
-                        for (int i = 1; i < delimLen; i++) {
-                            if (fCurrentEntity.position == fCurrentEntity.count) {
-                                fCurrentEntity.position -= i;
-                                break OUTER;
-                            }
-                            c = fCurrentEntity.ch[fCurrentEntity.position++];
-                            if (delimiter.charAt(i) != c) {
-                                fCurrentEntity.position--;
-                                break;
-                            }
-                         }
-                         if (fCurrentEntity.position == delimOffset + delimLen) {
-                            done = true;
+            OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
+                c = fCurrentEntity.ch[fCurrentEntity.position++];
+                if (c == charAt0) {
+                    // looks like we just hit the delimiter
+                    int delimOffset = fCurrentEntity.position - 1;
+                    for (int i = 1; i < delimLen; i++) {
+                        if (fCurrentEntity.position == fCurrentEntity.count) {
+                            fCurrentEntity.position -= i;
+                            break OUTER;
+                        }
+                        c = fCurrentEntity.ch[fCurrentEntity.position++];
+                        if (delimiter.charAt(i) != c) {
+                            fCurrentEntity.position--;
                             break;
-                         }
-                    }
-                    else if (c == '\n' || c == '\r' || c == 0x85 || c == 0x2028) {
-                        fCurrentEntity.position--;
+                        }
+                     }
+                     if (fCurrentEntity.position == delimOffset + delimLen) {
+                        done = true;
                         break;
-                    }
-                    // In external entities control characters cannot appear
-                    // as literals so do not skip over them.
-                    else if (!XML11Char.isXML11ValidLiteral(c)) {
-                        fCurrentEntity.position--;
-                        int length = fCurrentEntity.position - offset;
-                        fCurrentEntity.columnNumber += length - newlines;
-                        checkEntityLimit(NameType.COMMENT, fCurrentEntity, offset, length);
-                        buffer.append(fCurrentEntity.ch, offset, length);
-                        return true;
-                    }
+                     }
+                }
+                else if ((external && (c == '\n' || c == '\r' || c == 0x85 || c == 0x2028))
+                        || (!external && c == '\n')) {
+                    fCurrentEntity.position--;
+                    break;
+                }
+                // In external entities control characters cannot appear
+                // as literals so do not skip over them.
+                else if ((external && !XML11Char.isXML11ValidLiteral(c))
+                        // Control characters are allowed to appear as literals in internal entities.
+                        || (!external && !XML11Char.isXML11Valid(c))) {
+                    fCurrentEntity.position--;
+                    int length = fCurrentEntity.position - offset;
+                    fCurrentEntity.columnNumber += length - newlines;
+                    checkEntityLimit(NameType.COMMENT, fCurrentEntity, offset, length);
+                    buffer.append(fCurrentEntity.ch, offset, length);
+                    return true;
+                }
+                if (chunkLimit > 0 &&
+                        (buffer.length + fCurrentEntity.position - offset) >= chunkLimit) {
+                    break;
                 }
             }
-            else {
-                OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {
-                    c = fCurrentEntity.ch[fCurrentEntity.position++];
-                    if (c == charAt0) {
-                        // looks like we just hit the delimiter
-                        int delimOffset = fCurrentEntity.position - 1;
-                        for (int i = 1; i < delimLen; i++) {
-                            if (fCurrentEntity.position == fCurrentEntity.count) {
-                                fCurrentEntity.position -= i;
-                                break OUTER;
-                            }
-                            c = fCurrentEntity.ch[fCurrentEntity.position++];
-                            if (delimiter.charAt(i) != c) {
-                                fCurrentEntity.position--;
-                                break;
-                            }
-                        }
-                        if (fCurrentEntity.position == delimOffset + delimLen) {
-                            done = true;
-                            break;
-                        }
-                    }
-                    else if (c == '\n') {
-                        fCurrentEntity.position--;
-                        break;
-                    }
-                    // Control characters are allowed to appear as literals
-                    // in internal entities.
-                    else if (!XML11Char.isXML11Valid(c)) {
-                        fCurrentEntity.position--;
-                        int length = fCurrentEntity.position - offset;
-                        fCurrentEntity.columnNumber += length - newlines;
-                        checkEntityLimit(NameType.COMMENT, fCurrentEntity, offset, length);
-                        buffer.append(fCurrentEntity.ch, offset, length);
-                        return true;
-                    }
-                }
-            }
+
             int length = fCurrentEntity.position - offset;
             fCurrentEntity.columnNumber += length - newlines;
             checkEntityLimit(NameType.COMMENT, fCurrentEntity, offset, length);
@@ -1236,8 +1204,10 @@
             }
             buffer.append(fCurrentEntity.ch, offset, length);
 
-            // return true if string was skipped
-        } while (!done);
+            if (chunkLimit > 0 && buffer.length >= chunkLimit) {
+                break;
+            }
+        } while (!done && chunkLimit == 0);
         return !done;
 
     } // scanData(String,XMLString)
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -388,7 +388,7 @@
             return false;
 
         fStringBuffer.clear();
-        while (fEntityScanner.scanData("]", fStringBuffer)) {
+        while (fEntityScanner.scanData("]", fStringBuffer, 0)) {
             int c = fEntityScanner.peekChar();
             if (c != -1) {
                 if (XMLChar.isHighSurrogate(c)) {
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -200,7 +200,8 @@
                 JdkXmlUtils.CATALOG_DEFER,
                 JdkXmlUtils.CATALOG_FILES,
                 JdkXmlUtils.CATALOG_PREFER,
-                JdkXmlUtils.CATALOG_RESOLVE
+                JdkXmlUtils.CATALOG_RESOLVE,
+                JdkXmlUtils.CDATA_CHUNK_SIZE
     };
 
     /** Property defaults. */
@@ -212,7 +213,8 @@
                 null,
                 null,
                 null,
-                null
+                null,
+                JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT
     };
 
 
@@ -269,6 +271,9 @@
     /** SubScanner state: inside scanContent method. */
     protected boolean fInScanContent = false;
     protected boolean fLastSectionWasCData = false;
+    protected boolean fCDataStart = false;
+    protected boolean fInCData = false;
+    protected boolean fCDataEnd = false;
     protected boolean fLastSectionWasEntityReference = false;
     protected boolean fLastSectionWasCharacterData = false;
 
@@ -319,6 +324,11 @@
     protected boolean fDisallowDoctype = false;
 
     /**
+     * CDATA chunk size limit
+     */
+    private int fChunkSize;
+
+    /**
      * comma-delimited list of protocols that are allowed for the purpose
      * of accessing external dtd or entity references
      */
@@ -490,12 +500,18 @@
                     //therefore we don't need to take care of anything here. So Just break;
                     break;
                 case XMLStreamConstants.CDATA:
-                    fEntityScanner.checkNodeCount(fEntityScanner.fCurrentEntity);
-                    fDocumentHandler.startCDATA(null);
-                    //xxx: check if CDATA values comes from getCharacterData() function
+                   fEntityScanner.checkNodeCount(fEntityScanner.fCurrentEntity);
+                    if (fCDataStart) {
+                        fDocumentHandler.startCDATA(null);
+                        fCDataStart = false;
+                        fInCData = true;
+                    }
+
                     fDocumentHandler.characters(getCharacterData(),null);
-                    fDocumentHandler.endCDATA(null);
-                    //System.out.println(" in CDATA of the XMLNSDocumentScannerImpl");
+                    if (fCDataEnd) {
+                        fDocumentHandler.endCDATA(null);
+                        fCDataEnd = false;
+                    }
                     break;
                 case XMLStreamConstants.NOTATION_DECLARATION :
                     break;
@@ -603,6 +619,8 @@
         fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD);
 
         fStrictURI = componentManager.getFeature(STANDARD_URI_CONFORMANT, false);
+        fChunkSize = JdkXmlUtils.getValue(componentManager.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE),
+                JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
 
         resetCommon();
         //fEntityManager.test();
@@ -647,6 +665,8 @@
         fAccessExternalDTD = spm.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD);
 
         fSecurityManager = (XMLSecurityManager)propertyManager.getProperty(Constants.SECURITY_MANAGER);
+        fChunkSize = JdkXmlUtils.getValue(propertyManager.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE),
+                JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
         resetCommon();
     } // reset(XMLComponentManager)
 
@@ -1665,34 +1685,11 @@
 
         while (true) {
             //scanData will fill the contentBuffer
-            if (!fEntityScanner.scanData("]]>", contentBuffer)) {
+            if (!fEntityScanner.scanData("]]>", contentBuffer, fChunkSize)) {
+                fInCData = false;
+                fCDataEnd = true;
+                fMarkupDepth--;
                 break ;
-                /** We dont need all this code if we pass ']]>' as delimeter..
-                 * int brackets = 2;
-                 * while (fEntityScanner.skipChar(']')) {
-                 * brackets++;
-                 * }
-                 *
-                 * //When we find more than 2 square brackets
-                 * if (fDocumentHandler != null && brackets > 2) {
-                 * //we dont need to clear the buffer..
-                 * //contentBuffer.clear();
-                 * for (int i = 2; i < brackets; i++) {
-                 * contentBuffer.append(']');
-                 * }
-                 * fDocumentHandler.characters(contentBuffer, null);
-                 * }
-                 *
-                 * if (fEntityScanner.skipChar('>')) {
-                 * break;
-                 * }
-                 * if (fDocumentHandler != null) {
-                 * //we dont need to clear the buffer now..
-                 * //contentBuffer.clear();
-                 * contentBuffer.append("]]");
-                 * fDocumentHandler.characters(contentBuffer, null);
-                 * }
-                 **/
             } else {
                 int c = fEntityScanner.peekChar();
                 if (c != -1 && isInvalidLiteral(c)) {
@@ -1705,6 +1702,9 @@
                                 new Object[]{Integer.toString(c,16)});
                                 fEntityScanner.scanChar(null);
                     }
+                } else {
+                    //CData partially returned due to the size limit
+                    break;
                 }
                 //by this time we have also read surrogate contents if any...
                 if (fDocumentHandler != null) {
@@ -1712,16 +1712,6 @@
                 }
             }
         }
-        fMarkupDepth--;
-
-        if (fDocumentHandler != null && contentBuffer.length > 0) {
-            //fDocumentHandler.characters(contentBuffer, null);
-        }
-
-        // call handler
-        if (fDocumentHandler != null) {
-            //fDocumentHandler.endCDATA(null);
-        }
 
         return true;
 
@@ -2635,6 +2625,7 @@
                             }
                             setScannerState(SCANNER_STATE_COMMENT);
                         } else if (fEntityScanner.skipString(cdata)) {
+                            fCDataStart = true;
                             setScannerState(SCANNER_STATE_CDATA );
                         } else if (!scanForDoctypeHook()) {
                             reportFatalError("MarkupNotRecognizedInContent",
@@ -3015,9 +3006,11 @@
                         //xxx: What if CDATA is the first event
                         //<foo><![CDATA[hello<><>]]>append</foo>
 
-                        //we should not clear the buffer only when the last state was either SCANNER_STATE_REFERENCE or
+                        //we should not clear the buffer only when the last state was
+                        //either SCANNER_STATE_REFERENCE or
                         //SCANNER_STATE_CHARACTER_DATA or SCANNER_STATE_REFERENCE
-                        if(fIsCoalesce && ( fLastSectionWasEntityReference || fLastSectionWasCData || fLastSectionWasCharacterData)){
+                        if(fIsCoalesce && ( fLastSectionWasEntityReference ||
+                                fLastSectionWasCData || fLastSectionWasCharacterData)){
                             fLastSectionWasCData = true ;
                             fLastSectionWasEntityReference = false;
                             fLastSectionWasCharacterData = false;
@@ -3026,7 +3019,7 @@
                             fContentBuffer.clear();
                         }
                         fUsebuffer = true;
-                        //CDATA section is completely read in all the case.
+                        //CDATA section is read up to the chunk size limit
                         scanCDATASection(fContentBuffer , true);
                         setScannerState(SCANNER_STATE_CONTENT);
                         //1. if fIsCoalesce is set to true we set the variable fLastSectionWasCData to true
@@ -3036,13 +3029,16 @@
                         //2. Check if application has set for reporting CDATA event
                         //3. if the application has neither set the fIsCoalesce to true nor fReportCdataEvent
                         //return the cdata event as characters.
-                        if(fIsCoalesce){
+                        if (fIsCoalesce) {
                             fLastSectionWasCData = true ;
                             //there might be more data to coalesce.
                             continue;
-                        }else if(fReportCdataEvent){
+                        } else if(fReportCdataEvent) {
+                            if (!fCDataEnd) {
+                                setScannerState(SCANNER_STATE_CDATA);
+                            }
                             return XMLEvent.CDATA;
-                        } else{
+                        } else {
                             return XMLEvent.CHARACTERS;
                         }
                     }
@@ -3051,9 +3047,11 @@
                         fMarkupDepth++;
                         foundBuiltInRefs = false;
 
-                        //we should not clear the buffer only when the last state was either CDATA or
+                        //we should not clear the buffer only when the last state was
+                        //either CDATA or
                         //SCANNER_STATE_CHARACTER_DATA or SCANNER_STATE_REFERENCE
-                        if(fIsCoalesce && ( fLastSectionWasEntityReference || fLastSectionWasCData || fLastSectionWasCharacterData)){
+                        if(fIsCoalesce && ( fLastSectionWasEntityReference ||
+                                fLastSectionWasCData || fLastSectionWasCharacterData)){
                             //fLastSectionWasEntityReference or fLastSectionWasCData are only
                             //used when fIsCoalesce is set to true.
                             fLastSectionWasEntityReference = true ;
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java	Wed Nov 23 19:15:33 2016 +0000
@@ -968,9 +968,11 @@
                     case SCANNER_STATE_CONTENT: {
                         reportFatalError("ContentIllegalInProlog", null);
                         fEntityScanner.scanChar(null);
+                        return -1;
                     }
                     case SCANNER_STATE_REFERENCE: {
                         reportFatalError("ReferenceIllegalInProlog", null);
+                        return -1;
                     }
 
                     /**
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java	Wed Nov 23 19:15:33 2016 +0000
@@ -217,7 +217,8 @@
                 JdkXmlUtils.CATALOG_DEFER,
                 JdkXmlUtils.CATALOG_FILES,
                 JdkXmlUtils.CATALOG_PREFER,
-                JdkXmlUtils.CATALOG_RESOLVE
+                JdkXmlUtils.CATALOG_RESOLVE,
+                JdkXmlUtils.CDATA_CHUNK_SIZE
     };
 
     /** Property defaults. */
@@ -232,7 +233,8 @@
                 null,
                 null,
                 null,
-                null
+                null,
+                JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT
     };
 
     private static final String XMLEntity = "[xml]".intern();
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1350,13 +1350,15 @@
      * @param delimiter The string that signifies the end of the character
      *                  data to be scanned.
      * @param buffer    The XMLStringBuffer to fill.
+     * @param chunkLimit the size limit of the data to be scanned. Zero by default
+     * indicating no limit.
      *
      * @return Returns true if there is more data to scan, false otherwise.
      *
      * @throws IOException  Thrown if i/o error occurs.
      * @throws EOFException Thrown on end of file.
      */
-    protected boolean scanData(String delimiter, XMLStringBuffer buffer)
+    protected boolean scanData(String delimiter, XMLStringBuffer buffer, int chunkLimit)
     throws IOException {
 
         boolean done = false;
@@ -1505,6 +1507,10 @@
                     buffer.append(fCurrentEntity.ch, offset, length);
                     return true;
                 }
+                if (chunkLimit > 0 &&
+                        (buffer.length + fCurrentEntity.position - offset) >= chunkLimit) {
+                    break;
+                }
             }
             int length = fCurrentEntity.position - offset;
             fCurrentEntity.columnNumber += length - newlines;
@@ -1520,7 +1526,10 @@
                 print();
                 System.out.println(" -> " + done);
             }
-        } while (!done);
+            if (chunkLimit > 0 && buffer.length >= chunkLimit) {
+                break;
+            }
+        } while (!done && chunkLimit == 0);
         return !done;
 
     } // scanData(String, XMLStringBuffer)
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/XMLScanner.java	Wed Nov 23 19:15:33 2016 +0000
@@ -760,7 +760,7 @@
         // since scanData appends the parsed data to the buffer passed
         // a while loop would append the whole of parsed data to the buffer(data:XMLStringBuffer)
         //until all of the data is buffered.
-        if (fEntityScanner.scanData("?>", data)) {
+        if (fEntityScanner.scanData("?>", data, 0)) {
             do {
                 int c = fEntityScanner.peekChar();
                 if (c != -1) {
@@ -772,7 +772,7 @@
                                 fEntityScanner.scanChar(null);
                     }
                 }
-            } while (fEntityScanner.scanData("?>", data));
+            } while (fEntityScanner.scanData("?>", data, 0));
         }
 
     } // scanPIData(String,XMLString)
@@ -797,7 +797,7 @@
         // text
         // REVISIT: handle invalid character, eof
         text.clear();
-        while (fEntityScanner.scanData("--", text)) {
+        while (fEntityScanner.scanData("--", text, 0)) {
             int c = fEntityScanner.peekChar();
 
             //System.out.println( "XMLScanner#scanComment#text.toString() == " + text.toString() );
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java	Wed Nov 23 19:15:33 2016 +0000
@@ -250,7 +250,8 @@
         JdkXmlUtils.CATALOG_DEFER,
         JdkXmlUtils.CATALOG_FILES,
         JdkXmlUtils.CATALOG_PREFER,
-        JdkXmlUtils.CATALOG_RESOLVE
+        JdkXmlUtils.CATALOG_RESOLVE,
+        JdkXmlUtils.CDATA_CHUNK_SIZE
     };
 
     // Data
@@ -282,7 +283,7 @@
     private XSDDescription fXSDDescription = new XSDDescription();
     private String faccessExternalSchema = Constants.EXTERNAL_ACCESS_DEFAULT;
 
-    private WeakHashMap fJAXPCache;
+    private WeakHashMap<Object, SchemaGrammar> fJAXPCache;
     private Locale fLocale = Locale.getDefault();
 
     // XSLoader attributes
@@ -366,7 +367,7 @@
         }
         fCMBuilder = builder;
         fSchemaHandler = new XSDHandler(fGrammarBucket);
-        fJAXPCache = new WeakHashMap();
+        fJAXPCache = new WeakHashMap<>();
 
         fSettingsChanged = true;
     }
@@ -377,7 +378,7 @@
      * are recognized.
      */
     public String[] getRecognizedFeatures() {
-        return (String[])(RECOGNIZED_FEATURES.clone());
+        return RECOGNIZED_FEATURES.clone();
     } // getRecognizedFeatures():  String[]
 
     /**
@@ -419,7 +420,7 @@
      * are recognized.
      */
     public String[] getRecognizedProperties() {
-        return (String[])(RECOGNIZED_PROPERTIES.clone());
+        return RECOGNIZED_PROPERTIES.clone();
     } // getRecognizedProperties():  String[]
 
     /**
@@ -568,7 +569,7 @@
         desc.setBaseSystemId(source.getBaseSystemId());
         desc.setLiteralSystemId( source.getSystemId());
         // none of the other fields make sense for preparsing
-        Map locationPairs = new HashMap();
+        Map<String, LocationArray> locationPairs = new HashMap<>();
         // Process external schema location properties.
         // We don't call tokenizeSchemaLocationStr here, because we also want
         // to check whether the values are valid URI.
@@ -665,7 +666,7 @@
 
     // add external schema locations to the location pairs
     public static void processExternalHints(String sl, String nsl,
-            Map<String, XMLSchemaLoader.LocationArray> locations,
+            Map<String, LocationArray> locations,
             XMLErrorReporter er) {
         if (sl != null) {
             try {
@@ -694,9 +695,10 @@
         if (nsl != null) {
             try {
                 // similarly for no ns schema location property
-                XSAttributeDecl attrDecl = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
+                XSAttributeDecl attrDecl = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(
+                        SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
                 attrDecl.fType.validate(nsl, null, null);
-                LocationArray la = ((LocationArray)locations.get(XMLSymbols.EMPTY_STRING));
+                LocationArray la = locations.get(XMLSymbols.EMPTY_STRING);
                 if(la == null) {
                     la = new LocationArray();
                     locations.put(XMLSymbols.EMPTY_STRING, la);
@@ -763,14 +765,14 @@
             return;
         }
 
-        Class componentType = fJAXPSource.getClass().getComponentType();
+        Class<?> componentType = fJAXPSource.getClass().getComponentType();
         XMLInputSource xis = null;
         String sid = null;
         if (componentType == null) {
             // Not an array
             if (fJAXPSource instanceof InputStream ||
                     fJAXPSource instanceof InputSource) {
-                SchemaGrammar g = (SchemaGrammar)fJAXPCache.get(fJAXPSource);
+                SchemaGrammar g = fJAXPCache.get(fJAXPSource);
                 if (g != null) {
                     fGrammarBucket.putGrammar(g);
                     return;
@@ -823,7 +825,7 @@
         for (int i = 0; i < objArr.length; i++) {
             if (objArr[i] instanceof InputStream ||
                     objArr[i] instanceof InputSource) {
-                SchemaGrammar g = (SchemaGrammar)fJAXPCache.get(objArr[i]);
+                SchemaGrammar g = fJAXPCache.get(objArr[i]);
                 if (g != null) {
                     fGrammarBucket.putGrammar(g);
                     continue;
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java	Wed Nov 23 19:15:33 2016 +0000
@@ -344,13 +344,14 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
 
     /** Property defaults. */
     private static final Object[] PROPERTY_DEFAULTS =
         { null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null};
+            null, null, null, null, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT };
 
     // this is the number of valuestores of each kind
     // we expect an element to have.  It's almost
@@ -358,10 +359,14 @@
     protected static final int ID_CONSTRAINT_NUM = 1;
 
     // xsi:* attribute declarations
-    static final XSAttributeDecl XSI_TYPE = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_TYPE);
-    static final XSAttributeDecl XSI_NIL = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NIL);
-    static final XSAttributeDecl XSI_SCHEMALOCATION = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_SCHEMALOCATION);
-    static final XSAttributeDecl XSI_NONAMESPACESCHEMALOCATION = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
+    static final XSAttributeDecl XSI_TYPE =
+            SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_TYPE);
+    static final XSAttributeDecl XSI_NIL =
+            SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NIL);
+    static final XSAttributeDecl XSI_SCHEMALOCATION =
+            SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_SCHEMALOCATION);
+    static final XSAttributeDecl XSI_NONAMESPACESCHEMALOCATION =
+            SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
 
     //
     // Data
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java	Wed Nov 23 19:15:33 2016 +0000
@@ -336,7 +336,8 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
         addRecognizedProperties(recognizedProperties);
 
@@ -368,6 +369,7 @@
 
         fValidationManager = new ValidationManager();
         fProperties.put(VALIDATION_MANAGER, fValidationManager);
+        fProperties.put(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
 
         fVersionDetector = new XMLVersionDetector();
 
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java	Wed Nov 23 19:15:33 2016 +0000
@@ -350,7 +350,7 @@
 
     // This map's job is to act as a link between the Schema Element and its
     // XSDocumentInfo object.
-    private Map fDoc2XSDocumentMap = new HashMap();
+    private Map<Element, XSDocumentInfo> fDoc2XSDocumentMap = new HashMap<>();
 
     // map between <redefine> elements and the XSDocumentInfo
     // objects that correspond to the documents being redefined.
@@ -1104,10 +1104,12 @@
                 fSchemaGrammarDescription.setTargetNamespace(callerTNS);
 
                 boolean alreadyTraversed = false;
-                XMLInputSource schemaSource = resolveSchemaSource(fSchemaGrammarDescription, mustResolve, child, true);
+                XMLInputSource schemaSource =
+                        resolveSchemaSource(fSchemaGrammarDescription, mustResolve, child, true);
                 if (fNamespaceGrowth && refType == XSDDescription.CONTEXT_INCLUDE) {
                     try {
-                        final String schemaId = XMLEntityManager.expandSystemId(schemaSource.getSystemId(), schemaSource.getBaseSystemId(), false);
+                        final String schemaId = XMLEntityManager.expandSystemId(
+                                schemaSource.getSystemId(), schemaSource.getBaseSystemId(), false);
                         alreadyTraversed = sg.getDocumentLocations().contains(schemaId);
                     }
                     catch(MalformedURIException e) {
@@ -1133,10 +1135,11 @@
             // To handle mutual <include>s
             XSDocumentInfo newSchemaInfo = null;
             if (fLastSchemaWasDuplicate) {
-                newSchemaInfo = newSchemaRoot == null ? null : (XSDocumentInfo)fDoc2XSDocumentMap.get(newSchemaRoot);
+                newSchemaInfo = newSchemaRoot == null ? null : fDoc2XSDocumentMap.get(newSchemaRoot);
             }
             else {
-                newSchemaInfo = constructTrees(newSchemaRoot, schemaHint, fSchemaGrammarDescription, importCollision);
+                newSchemaInfo = constructTrees(newSchemaRoot, schemaHint,
+                        fSchemaGrammarDescription, importCollision);
             }
 
             if (localName.equals(SchemaSymbols.ELT_REDEFINE) &&
@@ -3552,9 +3555,11 @@
             // than checking its value.  Don't set the ERROR_HANDLER
             // or LOCALE properties unless they've actually changed.
             if (fErrorHandler != fSchemaParser.getProperty(ERROR_HANDLER)) {
-                fSchemaParser.setProperty(ERROR_HANDLER, (fErrorHandler != null) ? fErrorHandler : new DefaultErrorHandler());
+                fSchemaParser.setProperty(ERROR_HANDLER,
+                        (fErrorHandler != null) ? fErrorHandler : new DefaultErrorHandler());
                 if (fAnnotationValidator != null) {
-                    fAnnotationValidator.setProperty(ERROR_HANDLER, (fErrorHandler != null) ? fErrorHandler : new DefaultErrorHandler());
+                    fAnnotationValidator.setProperty(ERROR_HANDLER,
+                            (fErrorHandler != null) ? fErrorHandler : new DefaultErrorHandler());
                 }
             }
             if (fLocale != fSchemaParser.getProperty(LOCALE)) {
@@ -3567,7 +3572,8 @@
         catch (XMLConfigurationException e) {}
 
         try {
-            fSchemaParser.setFeature(CONTINUE_AFTER_FATAL_ERROR, fErrorReporter.getFeature(CONTINUE_AFTER_FATAL_ERROR));
+            fSchemaParser.setFeature(CONTINUE_AFTER_FATAL_ERROR,
+                    fErrorReporter.getFeature(CONTINUE_AFTER_FATAL_ERROR));
         } catch (XMLConfigurationException e) {}
 
         try {
@@ -3601,13 +3607,16 @@
             }
         } catch (XMLConfigurationException e) {}
 
-        fSecurityPropertyMgr = (XMLSecurityPropertyManager) componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER);
+        fSecurityPropertyMgr = (XMLSecurityPropertyManager)
+                componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER);
 
         //Passing on the setting to the parser
         fSchemaParser.setProperty(XML_SECURITY_PROPERTY_MANAGER, fSecurityPropertyMgr);
 
-        fAccessExternalDTD = fSecurityPropertyMgr.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD);
-        fAccessExternalSchema = fSecurityPropertyMgr.getValue(XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_SCHEMA);
+        fAccessExternalDTD = fSecurityPropertyMgr.getValue(
+                XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_DTD);
+        fAccessExternalSchema = fSecurityPropertyMgr.getValue(
+                XMLSecurityPropertyManager.Property.ACCESS_EXTERNAL_SCHEMA);
 
         // Passing the Catalog settings to the parser
         fUseCatalog = componentManager.getFeature(XMLConstants.USE_CATALOG);
@@ -3620,9 +3629,16 @@
         fResolve = (String)componentManager.getProperty(JdkXmlUtils.CATALOG_RESOLVE);
 
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
-            fSchemaParser.setProperty(f.getPropertyName(), componentManager.getProperty(f.getPropertyName()));
-            fEntityManager.setProperty(f.getPropertyName(), componentManager.getProperty(f.getPropertyName()));
+            fSchemaParser.setProperty(f.getPropertyName(),
+                    componentManager.getProperty(f.getPropertyName()));
+            fEntityManager.setProperty(f.getPropertyName(),
+                    componentManager.getProperty(f.getPropertyName()));
         }
+
+        fSchemaParser.setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE,
+                componentManager.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE));
+        fEntityManager.setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE,
+                componentManager.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE));
     } // reset(XMLComponentManager)
 
 
@@ -3635,11 +3651,10 @@
 
         for (int i = 0; i < fLocalElemStackPos; i++) {
             Element currElem = fLocalElementDecl[i];
-            //XSDocumentInfo currSchema = (XSDocumentInfo)fDoc2XSDocumentMap.get(DOMUtil.getDocument(currElem));
-            //XSDocumentInfo currSchema = (XSDocumentInfo)fDoc2XSDocumentMap.get(DOMUtil.getRoot(DOMUtil.getDocument(currElem)));
             XSDocumentInfo currSchema = fLocalElementDecl_schema[i];
             SchemaGrammar currGrammar = fGrammarBucket.getGrammar(currSchema.fTargetNamespace);
-            fElementTraverser.traverseLocal (fParticle[i], currElem, currSchema, currGrammar, fAllContext[i], fParent[i], fLocalElemNamespaceContext[i]);
+            fElementTraverser.traverseLocal (fParticle[i], currElem, currSchema,
+                    currGrammar, fAllContext[i], fParent[i], fLocalElemNamespaceContext[i]);
             // If it's an empty particle, remove it from the containing component.
             if (fParticle[i].fType == XSParticleDecl.PARTICLE_EMPTY) {
                 XSModelGroupImpl group = null;
@@ -4065,7 +4080,8 @@
             Element decl, XSDocumentInfo decl_Doc) {
 
         if (DEBUG_NODE_POOL) {
-            System.out.println("DOCUMENT NS:"+ currSchema.fTargetNamespace+" hashcode:"+ ((Object)currSchema.fSchemaElement).hashCode());
+            System.out.println("DOCUMENT NS:" + currSchema.fTargetNamespace + " hashcode:" +
+                    ((Object)currSchema.fSchemaElement).hashCode());
         }
         Object temp = decl_Doc;
         if (temp == null) {
@@ -4091,7 +4107,8 @@
 
     // returns whether more than <annotation>s occur in children of elem
     private boolean nonAnnotationContent(Element elem) {
-        for(Element child = DOMUtil.getFirstChildElement(elem); child != null; child = DOMUtil.getNextSiblingElement(child)) {
+        for(Element child = DOMUtil.getFirstChildElement(elem); child != null;
+                child = DOMUtil.getNextSiblingElement(child)) {
             if(!(DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION))) return true;
         }
         return false;
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
  */
-/*
+ /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -17,7 +17,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.sun.org.apache.xerces.internal.jaxp.validation;
 
 import com.sun.org.apache.xerces.internal.impl.Constants;
@@ -47,7 +46,8 @@
 import org.xml.sax.SAXException;
 
 /**
- * <p>A validator helper for <code>StreamSource</code>s.</p>
+ * <p>
+ * A validator helper for <code>StreamSource</code>s.</p>
  *
  * @author Michael Glavassevich, IBM
  * @author <a href="mailto:Sunitha.Reddy@Sun.com">Sunitha Reddy</a>
@@ -55,74 +55,98 @@
 final class StreamValidatorHelper implements ValidatorHelper {
 
     // feature identifiers
-
-    /** Feature identifier: parser settings. */
-    private static final String PARSER_SETTINGS =
-        Constants.XERCES_FEATURE_PREFIX + Constants.PARSER_SETTINGS;
+    /**
+     * Feature identifier: parser settings.
+     */
+    private static final String PARSER_SETTINGS
+            = Constants.XERCES_FEATURE_PREFIX + Constants.PARSER_SETTINGS;
 
     // property identifiers
-
-    /** Property identifier: entity resolver. */
-    private static final String ENTITY_RESOLVER =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_RESOLVER_PROPERTY;
+    /**
+     * Property identifier: entity resolver.
+     */
+    private static final String ENTITY_RESOLVER
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_RESOLVER_PROPERTY;
 
-    /** Property identifier: error handler. */
-    private static final String ERROR_HANDLER =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_HANDLER_PROPERTY;
+    /**
+     * Property identifier: error handler.
+     */
+    private static final String ERROR_HANDLER
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_HANDLER_PROPERTY;
 
-    /** Property identifier: error reporter. */
-    private static final String ERROR_REPORTER =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
+    /**
+     * Property identifier: error reporter.
+     */
+    private static final String ERROR_REPORTER
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
 
-    /** Property identifier: XML Schema validator. */
-    private static final String SCHEMA_VALIDATOR =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_VALIDATOR_PROPERTY;
+    /**
+     * Property identifier: XML Schema validator.
+     */
+    private static final String SCHEMA_VALIDATOR
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_VALIDATOR_PROPERTY;
 
-    /** Property identifier: symbol table. */
-    private static final String SYMBOL_TABLE =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;
+    /**
+     * Property identifier: symbol table.
+     */
+    private static final String SYMBOL_TABLE
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;
 
-    /** Property identifier: validation manager. */
-    private static final String VALIDATION_MANAGER =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY;
+    /**
+     * Property identifier: validation manager.
+     */
+    private static final String VALIDATION_MANAGER
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY;
 
-    private static final String DEFAULT_TRANSFORMER_IMPL = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
+    private static final String DEFAULT_TRANSFORMER_IMPL
+            = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
 
-    /** Property id: security manager. */
-    private static final String SECURITY_MANAGER =
-        Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY;
+    /**
+     * Property id: security manager.
+     */
+    private static final String SECURITY_MANAGER
+            = Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY;
 
     //
     // Data
     //
+    /**
+     * SoftReference to parser configuration. *
+     */
+    private SoftReference<XMLParserConfiguration> fConfiguration = new SoftReference<>(null);
 
-    /** SoftReference to parser configuration. **/
-    private SoftReference fConfiguration = new SoftReference(null);
-
-    /** Schema validator. **/
+    /**
+     * Schema validator. *
+     */
     private com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator fSchemaValidator;
 
-    /** Component manager. **/
+    /**
+     * Component manager. *
+     */
     private XMLSchemaValidatorComponentManager fComponentManager;
 
     private ValidatorHandlerImpl handler = null;
 
     public StreamValidatorHelper(XMLSchemaValidatorComponentManager componentManager) {
         fComponentManager = componentManager;
-        fSchemaValidator = (com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator) fComponentManager.getProperty(SCHEMA_VALIDATOR);
+        fSchemaValidator = (com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator)
+                fComponentManager.getProperty(SCHEMA_VALIDATOR);
     }
 
     public void validate(Source source, Result result)
-        throws SAXException, IOException {
+            throws SAXException, IOException {
         if (result == null || result instanceof StreamResult) {
             final StreamSource streamSource = (StreamSource) source;
-            TransformerHandler identityTransformerHandler ;
+            TransformerHandler identityTransformerHandler;
 
-            if( result!=null ) {
+            if (result != null) {
                 try {
-                    SAXTransformerFactory tf = fComponentManager.getFeature(Constants.ORACLE_FEATURE_SERVICE_MECHANISM) ?
-                                    (SAXTransformerFactory)SAXTransformerFactory.newInstance()
-                                    : (SAXTransformerFactory) TransformerFactory.newInstance(DEFAULT_TRANSFORMER_IMPL, StreamValidatorHelper.class.getClassLoader());
+                    SAXTransformerFactory tf = fComponentManager.getFeature(
+                            Constants.ORACLE_FEATURE_SERVICE_MECHANISM) ?
+                            (SAXTransformerFactory) SAXTransformerFactory.newInstance() :
+                            (SAXTransformerFactory) TransformerFactory.newInstance(
+                                    DEFAULT_TRANSFORMER_IMPL,
+                                    StreamValidatorHelper.class.getClassLoader());
                     identityTransformerHandler = tf.newTransformerHandler();
                 } catch (TransformerConfigurationException e) {
                     throw new TransformerFactoryConfigurationError(e);
@@ -133,13 +157,14 @@
                 identityTransformerHandler.setResult(result);
             }
 
-            XMLInputSource input = new XMLInputSource(streamSource.getPublicId(), streamSource.getSystemId(), null, false);
+            XMLInputSource input = new XMLInputSource(streamSource.getPublicId(),
+                    streamSource.getSystemId(), null, false);
             input.setByteStream(streamSource.getInputStream());
             input.setCharacterStream(streamSource.getReader());
 
             // Gets the parser configuration. We'll create and initialize a new one, if we
             // haven't created one before or if the previous one was garbage collected.
-            XMLParserConfiguration config = (XMLParserConfiguration) fConfiguration.get();
+            XMLParserConfiguration config = fConfiguration.get();
             if (config == null) {
                 config = initialize();
             }
@@ -155,18 +180,17 @@
 
             try {
                 config.parse(input);
-            }
-            catch (XMLParseException e) {
+            } catch (XMLParseException e) {
                 throw Util.toSAXParseException(e);
-            }
-            catch (XNIException e) {
+            } catch (XNIException e) {
                 throw Util.toSAXException(e);
             }
             return;
         }
-        throw new IllegalArgumentException(JAXPValidationMessageFormatter.formatMessage(fComponentManager.getLocale(),
+        throw new IllegalArgumentException(JAXPValidationMessageFormatter.formatMessage(
+                fComponentManager.getLocale(),
                 "SourceResultMismatch",
-                new Object [] {source.getClass().getName(), result.getClass().getName()}));
+                new Object[]{source.getClass().getName(), result.getClass().getName()}));
     }
 
     private XMLParserConfiguration initialize() {
@@ -197,7 +221,10 @@
         // Passing on the CatalogFeatures settings
         JdkXmlUtils.catalogFeaturesConfig2Config(fComponentManager, config);
 
-        fConfiguration = new SoftReference(config);
+        config.setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE,
+                fComponentManager.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE));
+
+        fConfiguration = new SoftReference<>(config);
         return config;
     }
 
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java	Wed Nov 23 19:15:33 2016 +0000
@@ -165,6 +165,8 @@
         for (Feature f : Feature.values()) {
             fXMLSchemaLoader.setProperty(f.getPropertyName(), null);
         }
+
+        fXMLSchemaLoader.setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
     }
 
     /**
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java	Wed Nov 23 19:15:33 2016 +0000
@@ -48,6 +48,7 @@
 import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
 import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
 import javax.xml.catalog.CatalogFeatures;
+import jdk.xml.internal.JdkXmlUtils;
 import org.w3c.dom.ls.LSResourceResolver;
 import org.xml.sax.ErrorHandler;
 
@@ -311,6 +312,9 @@
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
             setProperty(f.getPropertyName(), grammarContainer.getProperty(f.getPropertyName()));
         }
+
+        setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE,
+                grammarContainer.getProperty(JdkXmlUtils.CDATA_CHUNK_SIZE));
     }
 
     /**
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java	Wed Nov 23 19:15:33 2016 +0000
@@ -345,7 +345,8 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
         addRecognizedProperties(recognizedProperties);
 
@@ -429,6 +430,8 @@
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
             setProperty(f.getPropertyName(), null);
         }
+
+        setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
     } // <init>(SymbolTable,XMLGrammarPool)
 
     //
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java	Wed Nov 23 19:15:33 2016 +0000
@@ -328,7 +328,8 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
         addRecognizedProperties(recognizedProperties);
 
@@ -391,6 +392,8 @@
         for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
             setProperty(f.getPropertyName(), null);
         }
+
+        setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
     } // <init>(SymbolTable,XMLGrammarPool)
 
     //
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java	Wed Nov 23 19:15:33 2016 +0000
@@ -561,7 +561,8 @@
             JdkXmlUtils.CATALOG_DEFER,
             JdkXmlUtils.CATALOG_FILES,
             JdkXmlUtils.CATALOG_PREFER,
-            JdkXmlUtils.CATALOG_RESOLVE
+            JdkXmlUtils.CATALOG_RESOLVE,
+            JdkXmlUtils.CDATA_CHUNK_SIZE
         };
         addRecognizedProperties(recognizedProperties);
 
@@ -629,6 +630,8 @@
             fProperties.put(f.getPropertyName(), null);
         }
 
+        setProperty(JdkXmlUtils.CDATA_CHUNK_SIZE, JdkXmlUtils.CDATA_CHUNK_SIZE_DEFAULT);
+
         fConfigUpdated = false;
     } // <init>(SymbolTable,XMLGrammarPool)
 
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/EmptySerializer.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/EmptySerializer.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,9 +17,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: EmptySerializer.java,v 1.2.4.1 2005/09/15 08:15:16 suresh_emailid Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
 import java.io.IOException;
@@ -48,235 +46,224 @@
 public class EmptySerializer implements SerializationHandler
 {
     protected static final String ERR = "EmptySerializer method not over-ridden";
-    /**
-     * @see SerializationHandler#asContentHandler()
-     */
 
-    protected void couldThrowIOException() throws IOException
-    {
+    protected void couldThrowIOException() throws IOException {
         return; // don't do anything.
     }
 
-    protected void couldThrowSAXException() throws SAXException
+    protected void couldThrowSAXException() throws SAXException {
+        return; // don't do anything.
+    }
+
+    protected void couldThrowSAXException(char[] chars, int off, int len)
+        throws SAXException
     {
         return; // don't do anything.
     }
 
-    protected void couldThrowSAXException(char[] chars, int off, int len) throws SAXException
+    protected void couldThrowSAXException(String elemQName)
+        throws SAXException
     {
         return; // don't do anything.
     }
 
-    protected void couldThrowSAXException(String elemQName) throws SAXException
-    {
-        return; // don't do anything.
-    }
-
-    void aMethodIsCalled()
-    {
-
+    void aMethodIsCalled() {
         // throw new RuntimeException(err);
         return;
     }
 
-
     /**
      * @see SerializationHandler#asContentHandler()
      */
-    public ContentHandler asContentHandler() throws IOException
-    {
+    public ContentHandler asContentHandler() throws IOException {
         couldThrowIOException();
         return null;
     }
+
     /**
      * @see SerializationHandler#setContentHandler(org.xml.sax.ContentHandler)
      */
-    public void setContentHandler(ContentHandler ch)
-    {
+    public void setContentHandler(ContentHandler ch) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#close()
      */
-    public void close()
-    {
+    public void close() {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#getOutputFormat()
      */
-    public Properties getOutputFormat()
-    {
+    public Properties getOutputFormat() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see SerializationHandler#getOutputStream()
      */
-    public OutputStream getOutputStream()
-    {
+    public OutputStream getOutputStream() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see SerializationHandler#getWriter()
      */
-    public Writer getWriter()
-    {
+    public Writer getWriter() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see SerializationHandler#reset()
      */
-    public boolean reset()
-    {
+    public boolean reset() {
         aMethodIsCalled();
         return false;
     }
+
     /**
      * @see SerializationHandler#serialize(org.w3c.dom.Node)
      */
-    public void serialize(Node node) throws IOException
-    {
+    public void serialize(Node node) throws IOException {
         couldThrowIOException();
     }
+
     /**
      * @see SerializationHandler#setCdataSectionElements(java.util.ArrayList<String>)
      */
-    public void setCdataSectionElements(ArrayList<String> URI_and_localNames)
-    {
+    public void setCdataSectionElements(ArrayList<String> URI_and_localNames) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setEscaping(boolean)
      */
-    public boolean setEscaping(boolean escape) throws SAXException
-    {
+    public boolean setEscaping(boolean escape) throws SAXException {
         couldThrowSAXException();
         return false;
     }
+
     /**
      * @see SerializationHandler#setIndent(boolean)
      */
-    public void setIndent(boolean indent)
-    {
+    public void setIndent(boolean indent) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setIndentAmount(int)
      */
-    public void setIndentAmount(int spaces)
-    {
+    public void setIndentAmount(int spaces) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setIsStandalone(boolean)
      */
-    public void setIsStandalone(boolean isStandalone)
-    {
+    public void setIsStandalone(boolean isStandalone) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setOutputFormat(java.util.Properties)
      */
-    public void setOutputFormat(Properties format)
-    {
+    public void setOutputFormat(Properties format) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setOutputStream(java.io.OutputStream)
      */
-    public void setOutputStream(OutputStream output)
-    {
+    public void setOutputStream(OutputStream output) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setVersion(java.lang.String)
      */
-    public void setVersion(String version)
-    {
+    public void setVersion(String version) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setWriter(java.io.Writer)
      */
-    public void setWriter(Writer writer)
-    {
+    public void setWriter(Writer writer) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#setTransformer(javax.xml.transform.Transformer)
      */
-    public void setTransformer(Transformer transformer)
-    {
+    public void setTransformer(Transformer transformer) {
         aMethodIsCalled();
     }
+
     /**
      * @see SerializationHandler#getTransformer()
      */
-    public Transformer getTransformer()
-    {
+    public Transformer getTransformer() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see SerializationHandler#flushPending()
      */
-    public void flushPending() throws SAXException
-    {
+    public void flushPending() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
      */
-    public void addAttribute(
-        String uri,
-        String localName,
-        String rawName,
-        String type,
-        String value,
-        boolean XSLAttribute)
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value, boolean XSLAttribute)
         throws SAXException
     {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#addAttributes(org.xml.sax.Attributes)
      */
-    public void addAttributes(Attributes atts) throws SAXException
-    {
+    public void addAttributes(Attributes atts) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String)
      */
-    public void addAttribute(String name, String value)
-    {
+    public void addAttribute(String name, String value) {
         aMethodIsCalled();
     }
 
     /**
      * @see ExtendedContentHandler#characters(java.lang.String)
      */
-    public void characters(String chars) throws SAXException
-    {
+    public void characters(String chars) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#endElement(java.lang.String)
      */
-    public void endElement(String elemName) throws SAXException
-    {
+    public void endElement(String elemName) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#startDocument()
      */
-    public void startDocument() throws SAXException
-    {
+    public void startDocument() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String)
      */
@@ -285,13 +272,14 @@
     {
         couldThrowSAXException(qName);
     }
+
     /**
      * @see ExtendedContentHandler#startElement(java.lang.String)
      */
-    public void startElement(String qName) throws SAXException
-    {
+    public void startElement(String qName) throws SAXException {
         couldThrowSAXException(qName);
     }
+
     /**
      * @see ExtendedContentHandler#namespaceAfterStartElement(java.lang.String, java.lang.String)
      */
@@ -303,68 +291,67 @@
     /**
      * @see ExtendedContentHandler#startPrefixMapping(java.lang.String, java.lang.String, boolean)
      */
-    public boolean startPrefixMapping(
-        String prefix,
-        String uri,
-        boolean shouldFlush)
+    public boolean startPrefixMapping(String prefix, String uri,
+                                      boolean shouldFlush)
         throws SAXException
     {
         couldThrowSAXException();
         return false;
     }
+
     /**
      * @see ExtendedContentHandler#entityReference(java.lang.String)
      */
-    public void entityReference(String entityName) throws SAXException
-    {
+    public void entityReference(String entityName) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedContentHandler#getNamespaceMappings()
      */
-    public NamespaceMappings getNamespaceMappings()
-    {
+    public NamespaceMappings getNamespaceMappings() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see ExtendedContentHandler#getPrefix(java.lang.String)
      */
-    public String getPrefix(String uri)
-    {
+    public String getPrefix(String uri) {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see ExtendedContentHandler#getNamespaceURI(java.lang.String, boolean)
      */
-    public String getNamespaceURI(String name, boolean isElement)
-    {
+    public String getNamespaceURI(String name, boolean isElement) {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see ExtendedContentHandler#getNamespaceURIFromPrefix(java.lang.String)
      */
-    public String getNamespaceURIFromPrefix(String prefix)
-    {
+    public String getNamespaceURIFromPrefix(String prefix) {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
      */
-    public void setDocumentLocator(Locator arg0)
-    {
+    public void setDocumentLocator(Locator arg0) {
         aMethodIsCalled();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#endDocument()
      */
-    public void endDocument() throws SAXException
-    {
+    public void endDocument() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
      */
@@ -373,25 +360,24 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
      */
-    public void endPrefixMapping(String arg0) throws SAXException
-    {
+    public void endPrefixMapping(String arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
      */
-    public void startElement(
-        String arg0,
-        String arg1,
-        String arg2,
-        Attributes arg3)
+    public void startElement(String arg0, String arg1, String arg2,
+                             Attributes arg3)
         throws SAXException
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
      */
@@ -400,13 +386,14 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#characters(char[], int, int)
      */
-    public void characters(char[] arg0, int arg1, int arg2) throws SAXException
-    {
+    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
         couldThrowSAXException(arg0, arg1, arg2);
     }
+
     /**
      * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
      */
@@ -415,6 +402,7 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
      */
@@ -423,20 +411,21 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
      */
-    public void skippedEntity(String arg0) throws SAXException
-    {
+    public void skippedEntity(String arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see ExtendedLexicalHandler#comment(java.lang.String)
      */
-    public void comment(String comment) throws SAXException
-    {
+    public void comment(String comment) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#startDTD(java.lang.String, java.lang.String, java.lang.String)
      */
@@ -445,189 +434,187 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#endDTD()
      */
-    public void endDTD() throws SAXException
-    {
+    public void endDTD() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String)
      */
-    public void startEntity(String arg0) throws SAXException
-    {
+    public void startEntity(String arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#endEntity(java.lang.String)
      */
-    public void endEntity(String arg0) throws SAXException
-    {
+    public void endEntity(String arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#startCDATA()
      */
-    public void startCDATA() throws SAXException
-    {
+    public void startCDATA() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#endCDATA()
      */
-    public void endCDATA() throws SAXException
-    {
+    public void endCDATA() throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int)
      */
-    public void comment(char[] arg0, int arg1, int arg2) throws SAXException
-    {
+    public void comment(char[] arg0, int arg1, int arg2) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see XSLOutputAttributes#getDoctypePublic()
      */
-    public String getDoctypePublic()
-    {
+    public String getDoctypePublic() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see XSLOutputAttributes#getDoctypeSystem()
      */
-    public String getDoctypeSystem()
-    {
+    public String getDoctypeSystem() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see XSLOutputAttributes#getEncoding()
      */
-    public String getEncoding()
-    {
-        aMethodIsCalled();
-        return null;
-    }
-    /**
-     * @see XSLOutputAttributes#getIndent()
-     */
-    public boolean getIndent()
-    {
-        aMethodIsCalled();
-        return false;
-    }
-    /**
-     * @see XSLOutputAttributes#getIndentAmount()
-     */
-    public int getIndentAmount()
-    {
-        aMethodIsCalled();
-        return 0;
-    }
-    /**
-     * @see XSLOutputAttributes#getMediaType()
-     */
-    public String getMediaType()
-    {
+    public String getEncoding() {
         aMethodIsCalled();
         return null;
     }
+
     /**
-     * @see XSLOutputAttributes#getOmitXMLDeclaration()
+     * @see XSLOutputAttributes#getIndent()
      */
-    public boolean getOmitXMLDeclaration()
-    {
+    public boolean getIndent() {
         aMethodIsCalled();
         return false;
     }
+
+    /**
+     * @see XSLOutputAttributes#getIndentAmount()
+     */
+    public int getIndentAmount() {
+        aMethodIsCalled();
+        return 0;
+    }
+
+    /**
+     * @see XSLOutputAttributes#getMediaType()
+     */
+    public String getMediaType() {
+        aMethodIsCalled();
+        return null;
+    }
+
+    /**
+     * @see XSLOutputAttributes#getOmitXMLDeclaration()
+     */
+    public boolean getOmitXMLDeclaration() {
+        aMethodIsCalled();
+        return false;
+    }
+
     /**
      * @see XSLOutputAttributes#getStandalone()
      */
-    public String getStandalone()
-    {
+    public String getStandalone() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see XSLOutputAttributes#getVersion()
      */
-    public String getVersion()
-    {
+    public String getVersion() {
         aMethodIsCalled();
         return null;
     }
+
     /**
      * @see XSLOutputAttributes#setDoctype(java.lang.String, java.lang.String)
      */
-    public void setDoctype(String system, String pub)
-    {
+    public void setDoctype(String system, String pub) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setDoctypePublic(java.lang.String)
      */
-    public void setDoctypePublic(String doctype)
-    {
+    public void setDoctypePublic(String doctype) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setDoctypeSystem(java.lang.String)
      */
-    public void setDoctypeSystem(String doctype)
-    {
+    public void setDoctypeSystem(String doctype) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setEncoding(java.lang.String)
      */
-    public void setEncoding(String encoding)
-    {
+    public void setEncoding(String encoding) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setMediaType(java.lang.String)
      */
-    public void setMediaType(String mediatype)
-    {
+    public void setMediaType(String mediatype) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setOmitXMLDeclaration(boolean)
      */
-    public void setOmitXMLDeclaration(boolean b)
-    {
+    public void setOmitXMLDeclaration(boolean b) {
         aMethodIsCalled();
     }
+
     /**
      * @see XSLOutputAttributes#setStandalone(java.lang.String)
      */
-    public void setStandalone(String standalone)
-    {
+    public void setStandalone(String standalone) {
         aMethodIsCalled();
     }
+
     /**
      * @see org.xml.sax.ext.DeclHandler#elementDecl(java.lang.String, java.lang.String)
      */
-    public void elementDecl(String arg0, String arg1) throws SAXException
-    {
+    public void elementDecl(String arg0, String arg1) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.DeclHandler#attributeDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
      */
-    public void attributeDecl(
-        String arg0,
-        String arg1,
-        String arg2,
-        String arg3,
-        String arg4)
+    public void attributeDecl(String arg0, String arg1, String arg2,
+                              String arg3, String arg4)
         throws SAXException
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.DeclHandler#internalEntityDecl(java.lang.String, java.lang.String)
      */
@@ -636,6 +623,7 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ext.DeclHandler#externalEntityDecl(java.lang.String, java.lang.String, java.lang.String)
      */
@@ -644,32 +632,32 @@
     {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
      */
-    public void warning(SAXParseException arg0) throws SAXException
-    {
+    public void warning(SAXParseException arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
      */
-    public void error(SAXParseException arg0) throws SAXException
-    {
+    public void error(SAXParseException arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
      */
-    public void fatalError(SAXParseException arg0) throws SAXException
-    {
+    public void fatalError(SAXParseException arg0) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see Serializer#asDOMSerializer()
      */
-    public DOMSerializer asDOMSerializer() throws IOException
-    {
+    public DOMSerializer asDOMSerializer() throws IOException {
         couldThrowIOException();
         return null;
     }
@@ -684,8 +672,7 @@
     /**
      * @see ExtendedContentHandler#setSourceLocator(javax.xml.transform.SourceLocator)
      */
-    public void setSourceLocator(SourceLocator locator)
-    {
+    public void setSourceLocator(SourceLocator locator) {
         aMethodIsCalled();
     }
 
@@ -701,30 +688,30 @@
     /**
      * @see ExtendedContentHandler#characters(org.w3c.dom.Node)
      */
-    public void characters(Node node) throws SAXException
-    {
+    public void characters(Node node) throws SAXException {
         couldThrowSAXException();
     }
 
     /**
      * @see ExtendedContentHandler#addXSLAttribute(java.lang.String, java.lang.String, java.lang.String)
      */
-    public void addXSLAttribute(String qName, String value, String uri)
-    {
+    public void addXSLAttribute(String qName, String value, String uri) {
         aMethodIsCalled();
     }
 
     /**
      * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
      */
-    public void addAttribute(String uri, String localName, String rawName, String type, String value) throws SAXException
-    {
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value) throws SAXException {
         couldThrowSAXException();
     }
+
     /**
      * @see org.xml.sax.DTDHandler#notationDecl(java.lang.String, java.lang.String, java.lang.String)
      */
-    public void notationDecl(String arg0, String arg1, String arg2) throws SAXException
+    public void notationDecl(String arg0, String arg1, String arg2)
+        throws SAXException
     {
         couldThrowSAXException();
     }
@@ -732,12 +719,8 @@
     /**
      * @see org.xml.sax.DTDHandler#unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
      */
-    public void unparsedEntityDecl(
-        String arg0,
-        String arg1,
-        String arg2,
-        String arg3)
-        throws SAXException {
+    public void unparsedEntityDecl(String arg0, String arg1, String arg2,
+                                   String arg3) throws SAXException {
         couldThrowSAXException();
     }
 
@@ -746,10 +729,8 @@
      */
     public void setDTDEntityExpansion(boolean expand) {
         aMethodIsCalled();
-
     }
 
-
     public String getOutputProperty(String name) {
         aMethodIsCalled();
         return null;
@@ -762,19 +743,16 @@
 
     public void setOutputProperty(String name, String val) {
         aMethodIsCalled();
-
     }
 
     public void setOutputPropertyDefault(String name, String val) {
         aMethodIsCalled();
-
     }
 
     /**
      * @see org.apache.xml.serializer.Serializer#asDOM3Serializer()
      */
-    public Object asDOM3Serializer() throws IOException
-    {
+    public Object asDOM3Serializer() throws IOException {
         couldThrowIOException();
         return null;
     }
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/SerializerBase.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/SerializerBase.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,15 +1,13 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -19,22 +17,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: SerializerBase.java,v 1.5 2006/04/14 12:09:19 sunithareddy Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
+import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
+import com.sun.org.apache.xml.internal.serializer.utils.Utils;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Set;
 import java.util.ArrayList;
-
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.SourceLocator;
 import javax.xml.transform.Transformer;
-
-import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
-import com.sun.org.apache.xml.internal.serializer.utils.Utils;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.Locator;
@@ -42,7 +36,6 @@
 import org.xml.sax.SAXParseException;
 import org.xml.sax.ext.Locator2;
 
-
 /**
  * This class acts as a base class for the XML "serializers"
  * and the stream serializers.
@@ -54,7 +47,6 @@
     implements SerializationHandler, SerializerConstants
 {
 
-
     /**
      * To fire off the end element trace event
      * @param name Name of element
@@ -62,8 +54,7 @@
     protected void fireEndElem(String name)
         throws org.xml.sax.SAXException
     {
-        if (m_tracer != null)
-        {
+        if (m_tracer != null) {
             flushMyWriter();
             m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_ENDELEMENT,name, (Attributes)null);
         }
@@ -78,8 +69,7 @@
     protected void fireCharEvent(char[] chars, int start, int length)
         throws org.xml.sax.SAXException
     {
-        if (m_tracer != null)
-        {
+        if (m_tracer != null) {
             flushMyWriter();
             m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CHARACTERS, chars, start,length);
         }
@@ -87,7 +77,7 @@
 
     /**
      * true if we still need to call startDocumentInternal()
-         */
+     */
     protected boolean m_needToCallStartDocument = true;
 
     /** True if a trailing "]]>" still needs to be written to be
@@ -150,6 +140,7 @@
      * Flag to tell if indenting (pretty-printing) is on.
      */
     protected boolean m_doIndent = false;
+
     /**
      * Amount to indent.
      */
@@ -186,7 +177,6 @@
 
     protected SourceLocator m_sourceLocator;
 
-
     /**
      * The writer to send output to. This field is only used in the ToStream
      * serializers, but exists here just so that the fireStartDoc() and
@@ -227,11 +217,9 @@
      *
      * @see ExtendedLexicalHandler#comment(String)
      */
-    public void comment(String data) throws SAXException
-    {
+    public void comment(String data) throws SAXException {
         final int length = data.length();
-        if (length > m_charsBuff.length)
-        {
+        if (length > m_charsBuff.length) {
             m_charsBuff = new char[length * 2 + 1];
         }
         data.getChars(0, length, m_charsBuff, 0);
@@ -248,10 +236,7 @@
      * XML file, it sometimes generates a NS prefix of the form "ns?" for
      * an attribute.
      */
-    protected String patchName(String qname)
-    {
-
-
+    protected String patchName(String qname) {
         final int lastColon = qname.lastIndexOf(':');
 
         if (lastColon > 0) {
@@ -259,12 +244,11 @@
             final String prefix = qname.substring(0, firstColon);
             final String localName = qname.substring(lastColon + 1);
 
-        // If uri is "" then ignore prefix
+            // If uri is "" then ignore prefix
             final String uri = m_prefixMap.lookupNamespace(prefix);
             if (uri != null && uri.length() == 0) {
                 return localName;
-            }
-            else if (firstColon != lastColon) {
+            } else if (firstColon != lastColon) {
                 return prefix + ':' + localName;
             }
         }
@@ -277,8 +261,7 @@
      * @param qname the qualified name
      * @return the name, but excluding any prefix and colon.
      */
-    protected static String getLocalName(String qname)
-    {
+    protected static String getLocalName(String qname) {
         final int col = qname.lastIndexOf(':');
         return (col > 0) ? qname.substring(col + 1) : qname;
     }
@@ -309,8 +292,7 @@
      * during the invocation of the events in this interface.  The
      * application should not attempt to use it at any other time.</p>
      */
-    public void setDocumentLocator(Locator locator)
-    {
+    public void setDocumentLocator(Locator locator) {
         m_locator = locator;
     }
 
@@ -332,20 +314,13 @@
      * @param XSLAttribute true if this attribute is coming from an xsl:attriute element
      * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
      */
-    public void addAttribute(
-        String uri,
-        String localName,
-        String rawName,
-        String type,
-        String value,
-        boolean XSLAttribute)
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value, boolean XSLAttribute)
         throws SAXException
     {
-        if (m_elemContext.m_startTagOpen)
-        {
+        if (m_elemContext.m_startTagOpen) {
             addAttributeAlways(uri, localName, rawName, type, value, XSLAttribute);
         }
-
     }
 
     /**
@@ -362,51 +337,32 @@
      * @return true if the attribute was added,
      * false if an existing value was replaced.
      */
-    public boolean addAttributeAlways(
-        String uri,
-        String localName,
-        String rawName,
-        String type,
-        String value,
-        boolean XSLAttribute)
+    public boolean addAttributeAlways(String uri, String localName, String rawName,
+                                      String type, String value, boolean XSLAttribute)
     {
         boolean was_added;
-//            final int index =
-//                (localName == null || uri == null) ?
-//                m_attributes.getIndex(rawName):m_attributes.getIndex(uri, localName);
-            int index;
-//            if (localName == null || uri == null){
-//                index = m_attributes.getIndex(rawName);
-//            }
-//            else {
-//                index = m_attributes.getIndex(uri, localName);
-//            }
+        int index;
 
-            if (localName == null || uri == null || uri.length() == 0)
-                index = m_attributes.getIndex(rawName);
-            else {
-                index = m_attributes.getIndex(uri,localName);
-            }
-            if (index >= 0)
-            {
-                /* We've seen the attribute before.
-                 * We may have a null uri or localName, but all
-                 * we really want to re-set is the value anyway.
-                 */
-                m_attributes.setValue(index,value);
-                was_added = false;
-            }
-            else
-            {
-                // the attribute doesn't exist yet, create it
-                m_attributes.addAttribute(uri, localName, rawName, type, value);
-                was_added = true;
-            }
-            return was_added;
-
+        if (localName == null || uri == null || uri.length() == 0)
+            index = m_attributes.getIndex(rawName);
+        else {
+            index = m_attributes.getIndex(uri,localName);
+        }
+        if (index >= 0) {
+            /* We've seen the attribute before.
+             * We may have a null uri or localName, but all
+             * we really want to re-set is the value anyway.
+             */
+            m_attributes.setValue(index,value);
+            was_added = false;
+        } else {
+            // the attribute doesn't exist yet, create it
+            m_attributes.addAttribute(uri, localName, rawName, type, value);
+            was_added = true;
+        }
+        return was_added;
     }
 
-
     /**
      *  Adds  the given attribute to the set of collected attributes,
      * but only if there is a currently open element.
@@ -414,16 +370,14 @@
      * @param name the attribute's qualified name
      * @param value the value of the attribute
      */
-    public void addAttribute(String name, final String value)
-    {
-        if (m_elemContext.m_startTagOpen)
-        {
+    public void addAttribute(String name, final String value) {
+        if (m_elemContext.m_startTagOpen) {
             final String patchedName = patchName(name);
             final String localName = getLocalName(patchedName);
             final String uri = getNamespaceURI(patchedName, false);
 
             addAttributeAlways(uri,localName, patchedName, "CDATA", value, false);
-         }
+        }
     }
 
     /**
@@ -434,15 +388,13 @@
      * @param value the value of the attribute
      * @param uri the URI that the prefix of the name points to
      */
-    public void addXSLAttribute(String name, final String value, final String uri)
-    {
-        if (m_elemContext.m_startTagOpen)
-        {
+    public void addXSLAttribute(String name, final String value, final String uri) {
+        if (m_elemContext.m_startTagOpen) {
             final String patchedName = patchName(name);
             final String localName = getLocalName(patchedName);
 
             addAttributeAlways(uri,localName, patchedName, "CDATA", value, true);
-         }
+        }
     }
 
     /**
@@ -451,12 +403,9 @@
      * is currently open.
      * @param atts List of attributes to add to this list
      */
-    public void addAttributes(Attributes atts) throws SAXException
-    {
-
+    public void addAttributes(Attributes atts) throws SAXException {
         int nAtts = atts.getLength();
-        for (int i = 0; i < nAtts; i++)
-        {
+        for (int i = 0; i < nAtts; i++) {
             String uri = atts.getURI(i);
 
             if (null == uri)
@@ -469,7 +418,6 @@
                 atts.getType(i),
                 atts.getValue(i),
                 false);
-
         }
     }
 
@@ -482,8 +430,7 @@
      *  or null if the serializer is not SAX 2 capable
      * @throws IOException An I/O exception occured
      */
-    public ContentHandler asContentHandler() throws IOException
-    {
+    public ContentHandler asContentHandler() throws IOException {
         return this;
     }
 
@@ -494,8 +441,7 @@
      * @throws org.xml.sax.SAXException The application may raise an exception.
      * @see #startEntity
      */
-    public void endEntity(String name) throws org.xml.sax.SAXException
-    {
+    public void endEntity(String name) throws org.xml.sax.SAXException {
         if (name.equals("[dtd]"))
             m_inExternalDTD = false;
         m_inEntityRef = false;
@@ -509,27 +455,24 @@
      * ToStream serializers, not ToSAXHandler serializers.
      * @see ToStream
      */
-    public void close()
-    {
+    public void close() {
         // do nothing (base behavior)
     }
 
     /**
      * Initialize global variables
      */
-    protected void initCDATA()
-    {
+    protected void initCDATA() {
         // CDATA stack
-        //        _cdataStack = new Stack();
-        //        _cdataStack.push(new Integer(-1)); // push dummy value
+        // _cdataStack = new Stack();
+        // _cdataStack.push(new Integer(-1)); // push dummy value
     }
 
     /**
      * Returns the character encoding to be used in the output document.
      * @return the character encoding to be used in the output document.
      */
-    public String getEncoding()
-    {
+    public String getEncoding() {
         return getOutputProperty(OutputKeys.ENCODING);
     }
 
@@ -537,8 +480,7 @@
      * Sets the character encoding coming from the xsl:output encoding stylesheet attribute.
      * @param m_encoding the character encoding
      */
-    public void setEncoding(String encoding)
-    {
+    public void setEncoding(String encoding) {
         setOutputProperty(OutputKeys.ENCODING,encoding);
     }
 
@@ -547,19 +489,16 @@
      * @param b true if the XML declaration is to be omitted from the output
      * document.
      */
-    public void setOmitXMLDeclaration(boolean b)
-    {
+    public void setOmitXMLDeclaration(boolean b) {
         String val = b ? "yes":"no";
         setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,val);
     }
 
-
     /**
      * @return true if the XML declaration is to be omitted from the output
      * document.
      */
-    public boolean getOmitXMLDeclaration()
-    {
+    public boolean getOmitXMLDeclaration() {
         return m_shouldNotWriteXMLHeader;
     }
 
@@ -625,8 +564,7 @@
      * document. This method remembers if the value was explicitly set using
      * this method, verses if the value is the default value.
      */
-    public void setStandalone(String standalone)
-    {
+    public void setStandalone(String standalone) {
         setOutputProperty(OutputKeys.STANDALONE, standalone);
     }
 
@@ -635,8 +573,7 @@
      * default or explicite setting.
      * @param standalone "yes" | "no"
      */
-    protected void setStandaloneInternal(String standalone)
-    {
+    protected void setStandaloneInternal(String standalone) {
         if ("yes".equals(standalone))
             m_standalone = "yes";
         else
@@ -650,8 +587,7 @@
      * be included in the output document.
      *  @see XSLOutputAttributes#getStandalone()
      */
-    public String getStandalone()
-    {
+    public String getStandalone() {
         return m_standalone;
     }
 
@@ -659,8 +595,7 @@
      * @return true if the output document should be indented to visually
      * indicate its structure.
      */
-    public boolean getIndent()
-    {
+    public boolean getIndent() {
         return m_doIndent;
     }
     /**
@@ -669,8 +604,7 @@
      * @return the mediatype the media-type or MIME type associated with the
      * output document.
      */
-    public String getMediaType()
-    {
+    public String getMediaType() {
         return m_mediatype;
     }
 
@@ -678,8 +612,7 @@
      * Gets the version of the output format.
      * @return the version of the output format.
      */
-    public String getVersion()
-    {
+    public String getVersion() {
         return m_version;
     }
 
@@ -688,8 +621,7 @@
      * @param version the version of the output format.
      * @see SerializationHandler#setVersion(String)
      */
-    public void setVersion(String version)
-    {
+    public void setVersion(String version) {
         setOutputProperty(OutputKeys.VERSION, version);
     }
 
@@ -700,16 +632,14 @@
      * @see javax.xml.transform.OutputKeys#MEDIA_TYPE
      * @see SerializationHandler#setMediaType(String)
      */
-    public void setMediaType(String mediaType)
-    {
+    public void setMediaType(String mediaType) {
         setOutputProperty(OutputKeys.MEDIA_TYPE,mediaType);
     }
 
     /**
      * @return the number of spaces to indent for each indentation level.
      */
-    public int getIndentAmount()
-    {
+    public int getIndentAmount() {
         return m_indentAmount;
     }
 
@@ -717,8 +647,7 @@
      * Sets the indentation amount.
      * @param m_indentAmount The m_indentAmount to set
      */
-    public void setIndentAmount(int m_indentAmount)
-    {
+    public void setIndentAmount(int m_indentAmount) {
         this.m_indentAmount = m_indentAmount;
     }
 
@@ -729,8 +658,7 @@
      * visually indicate its structure.
      * @see XSLOutputAttributes#setIndent(boolean)
      */
-    public void setIndent(boolean doIndent)
-    {
+    public void setIndent(boolean doIndent) {
         String val = doIndent ? "yes":"no";
         setOutputProperty(OutputKeys.INDENT,val);
     }
@@ -740,8 +668,7 @@
      * @param isStandalone true if the ORACLE_IS_STANDALONE is set to yes
      * @see OutputPropertiesFactory ORACLE_IS_STANDALONE
      */
-    public void setIsStandalone(boolean isStandalone)
-    {
+    public void setIsStandalone(boolean isStandalone) {
        m_isStandalone = isStandalone;
     }
 
@@ -772,8 +699,7 @@
      * @throws IOException An I/O exception occured
      * @see Serializer#asDOMSerializer()
      */
-    public DOMSerializer asDOMSerializer() throws IOException
-    {
+    public DOMSerializer asDOMSerializer() throws IOException {
         return this;
     }
 
@@ -785,8 +711,7 @@
      *
      * @return true if strings are equal.
      */
-    private static final boolean subPartMatch(String p, String t)
-    {
+    private static final boolean subPartMatch(String p, String t) {
         return (p == t) || ((null != p) && (p.equals(t)));
     }
 
@@ -799,8 +724,7 @@
      * @return returns the prefix of the qualified name,
      * or null if there is no prefix.
      */
-    protected static final String getPrefixPart(String qname)
-    {
+    protected static final String getPrefixPart(String qname) {
         final int col = qname.indexOf(':');
         return (col > 0) ? qname.substring(0, col) : null;
         //return (col > 0) ? qname.substring(0,col) : "";
@@ -811,8 +735,7 @@
      * @return the current namespace mappings (prefix/uri)
      * @see ExtendedContentHandler#getNamespaceMappings()
      */
-    public NamespaceMappings getNamespaceMappings()
-    {
+    public NamespaceMappings getNamespaceMappings() {
         return m_prefixMap;
     }
 
@@ -822,8 +745,7 @@
      * @return a prefix pointing to the given URI (if any).
      * @see ExtendedContentHandler#getPrefix(String)
      */
-    public String getPrefix(String namespaceURI)
-    {
+    public String getPrefix(String namespaceURI) {
         String prefix = m_prefixMap.lookupPrefix(namespaceURI);
         return prefix;
     }
@@ -836,19 +758,15 @@
      * an element.
      * @return returns the namespace URI associated with the qualified name.
      */
-    public String getNamespaceURI(String qname, boolean isElement)
-    {
+    public String getNamespaceURI(String qname, boolean isElement) {
         String uri = EMPTYSTRING;
         int col = qname.lastIndexOf(':');
         final String prefix = (col > 0) ? qname.substring(0, col) : EMPTYSTRING;
 
-        if (!EMPTYSTRING.equals(prefix) || isElement)
-        {
-            if (m_prefixMap != null)
-            {
+        if (!EMPTYSTRING.equals(prefix) || isElement) {
+            if (m_prefixMap != null) {
                 uri = m_prefixMap.lookupNamespace(prefix);
-                if (uri == null && !prefix.equals(XMLNS_PREFIX))
-                {
+                if (uri == null && !prefix.equals(XMLNS_PREFIX)) {
                     throw new RuntimeException(
                         Utils.messages.createMessage(
                             MsgKey.ER_NAMESPACE_PREFIX,
@@ -866,8 +784,7 @@
      * @return the namespace URI currently associated with the
      * prefix, null if the prefix is undefined.
      */
-    public String getNamespaceURIFromPrefix(String prefix)
-    {
+    public String getNamespaceURIFromPrefix(String prefix) {
         String uri = null;
         if (m_prefixMap != null)
             uri = m_prefixMap.lookupNamespace(prefix);
@@ -881,16 +798,14 @@
      *
      * @throws org.xml.sax.SAXException
      */
-    public void entityReference(String name) throws org.xml.sax.SAXException
-    {
-
+    public void entityReference(String name) throws org.xml.sax.SAXException {
         flushPending();
 
         startEntity(name);
         endEntity(name);
 
         if (m_tracer != null)
-                    fireEntityReference(name);
+            fireEntityReference(name);
     }
 
     /**
@@ -898,8 +813,7 @@
      * @param t the transformer associated with this serializer.
      * @see SerializationHandler#setTransformer(Transformer)
      */
-    public void setTransformer(Transformer t)
-    {
+    public void setTransformer(Transformer t) {
         m_transformer = t;
 
         // If this transformer object implements the SerializerTrace interface
@@ -912,13 +826,13 @@
            m_tracer = null;
         }
     }
+
     /**
      * Gets the transformer associated with this serializer
      * @return returns the transformer associated with this serializer.
      * @see SerializationHandler#getTransformer()
      */
-    public Transformer getTransformer()
-    {
+    public Transformer getTransformer() {
         return m_transformer;
     }
 
@@ -933,11 +847,9 @@
     {
         flushPending();
         String data = node.getNodeValue();
-        if (data != null)
-        {
+        if (data != null) {
             final int length = data.length();
-            if (length > m_charsBuff.length)
-            {
+            if (length > m_charsBuff.length) {
                 m_charsBuff = new char[length * 2 + 1];
             }
             data.getChars(0, length, m_charsBuff, 0);
@@ -956,16 +868,13 @@
      * @see org.xml.sax.ErrorHandler#fatalError(SAXParseException)
      */
     public void fatalError(SAXParseException exc) throws SAXException {
-
-      m_elemContext.m_startTagOpen = false;
-
+        m_elemContext.m_startTagOpen = false;
     }
 
     /**
      * @see org.xml.sax.ErrorHandler#warning(SAXParseException)
      */
-    public void warning(SAXParseException exc) throws SAXException
-    {
+    public void warning(SAXParseException exc) throws SAXException {
     }
 
     /**
@@ -983,20 +892,6 @@
     }
 
     /**
-     * Report the characters event
-     * @param chars  content of characters
-     * @param start  starting index of characters to output
-     * @param length  number of characters to output
-     */
-//    protected void fireCharEvent(char[] chars, int start, int length)
-//        throws org.xml.sax.SAXException
-//    {
-//        if (m_tracer != null)
-//            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CHARACTERS, chars, start,length);
-//    }
-//
-
-    /**
      * This method is only used internally when flushing the writer from the
      * various fire...() trace events.  Due to the writer being wrapped with
      * SerializerTraceWriter it may cause the flush of these trace events:
@@ -1005,20 +900,15 @@
      * which trace the output written to the output stream.
      *
      */
-    private void flushMyWriter()
-    {
-        if (m_writer != null)
-        {
-            try
-            {
+    private void flushMyWriter() {
+        if (m_writer != null) {
+            try {
                 m_writer.flush();
-            }
-            catch(IOException ioe)
-            {
-
+            } catch(IOException ioe) {
             }
         }
     }
+
     /**
      * Report the CDATA trace event
      * @param chars  content of CDATA
@@ -1028,10 +918,9 @@
     protected void fireCDATAEvent(char[] chars, int start, int length)
         throws org.xml.sax.SAXException
     {
-                if (m_tracer != null)
-        {
+        if (m_tracer != null) {
             flushMyWriter();
-                        m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CDATA, chars, start,length);
+            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_CDATA, chars, start,length);
         }
     }
 
@@ -1044,10 +933,9 @@
     protected void fireCommentEvent(char[] chars, int start, int length)
         throws org.xml.sax.SAXException
     {
-                if (m_tracer != null)
-        {
+        if (m_tracer != null) {
             flushMyWriter();
-                        m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_COMMENT, new String(chars, start, length));
+            m_tracer.fireGenerateEvent(SerializerTrace.EVENTTYPE_COMMENT, new String(chars, start, length));
         }
     }
 
@@ -1221,12 +1109,10 @@
      *
      * @see ExtendedContentHandler#setSourceLocator(javax.xml.transform.SourceLocator)
      */
-    public void setSourceLocator(SourceLocator locator)
-    {
+    public void setSourceLocator(SourceLocator locator) {
         m_sourceLocator = locator;
     }
 
-
     /**
      * Used only by TransformerSnapshotImpl to restore the serialization
      * to a previous state.
@@ -1237,8 +1123,7 @@
         m_prefixMap = mappings;
     }
 
-    public boolean reset()
-    {
+    public boolean reset() {
         resetSerializerBase();
         return true;
     }
@@ -1247,8 +1132,7 @@
      * Reset all of the fields owned by SerializerBase
      *
      */
-    private void resetSerializerBase()
-    {
+    private void resetSerializerBase() {
         this.m_attributes.clear();
         this.m_StringOfCDATASections = null;
         this.m_elemContext = new ElemContext();
@@ -1280,13 +1164,12 @@
      *
      * This concept is made clear in the XSLT 2.0 draft.
      */
-    final boolean inTemporaryOutputState()
-    {
+    final boolean inTemporaryOutputState() {
         /* This is a hack. We should really be letting the serializer know
          * that it is in temporary output state with an explicit call, but
          * from a pragmatic point of view (for now anyways) having no output
-         * encoding at all, not even the default UTF-8 indicates that the serializer
-         * is being used for temporary RTF.
+         * encoding at all, not even the default UTF-8 indicates that the
+         * serializer is being used for temporary RTF.
          */
         return (getEncoding() == null);
 
@@ -1295,36 +1178,38 @@
     /**
      * This method adds an attribute the the current element,
      * but should not be used for an xsl:attribute child.
-     * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+     * @see ExtendedContentHandler#addAttribute(java.lang.String, java.lang.String,
+     *          java.lang.String, java.lang.String, java.lang.String)
      */
-    public void addAttribute(String uri, String localName, String rawName, String type, String value) throws SAXException
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value) throws SAXException
     {
-        if (m_elemContext.m_startTagOpen)
-        {
+        if (m_elemContext.m_startTagOpen) {
             addAttributeAlways(uri, localName, rawName, type, value, false);
         }
     }
 
     /**
-     * @see org.xml.sax.DTDHandler#notationDecl(java.lang.String, java.lang.String, java.lang.String)
+     * @see org.xml.sax.DTDHandler#notationDecl(java.lang.String,
+     *          java.lang.String, java.lang.String)
      */
     public void notationDecl(String arg0, String arg1, String arg2)
-        throws SAXException {
+        throws SAXException
+    {
         // This method just provides a definition to satisfy the interface
-        // A particular sub-class of SerializerBase provides the implementation (if desired)
+        // A particular sub-class of SerializerBase provides the implementation
+        // (if desired)
     }
 
     /**
-     * @see org.xml.sax.DTDHandler#unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+     * @see org.xml.sax.DTDHandler#unparsedEntityDecl(java.lang.String,
+     *          java.lang.String, java.lang.String, java.lang.String)
      */
-    public void unparsedEntityDecl(
-        String arg0,
-        String arg1,
-        String arg2,
-        String arg3)
-        throws SAXException {
+    public void unparsedEntityDecl(String arg0, String arg1, String arg2,
+                                   String arg3) throws SAXException {
         // This method just provides a definition to satisfy the interface
-        // A particular sub-class of SerializerBase provides the implementation (if desired)
+        // A particular sub-class of SerializerBase provides the implementation
+        // (if desired)
     }
 
     /**
@@ -1606,6 +1491,7 @@
      * map will have what that attribute maps to.
      */
     private HashMap<String, String> m_OutputProps;
+
     /**
      * A mapping of keys to default values, for example if
      * the default value of the encoding is "UTF-8" then this
@@ -1616,6 +1502,7 @@
     Set<String> getOutputPropDefaultKeys() {
         return m_OutputPropsDefault.keySet();
     }
+
     Set<String> getOutputPropKeys() {
         return m_OutputProps.keySet();
     }
@@ -1634,6 +1521,7 @@
 
         return val;
     }
+
     /**
      *
      * @param name The name of the property, e.g. "{http://myprop}indent-tabs" or "indent".
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToSAXHandler.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToSAXHandler.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,13 +1,13 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -17,13 +17,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: ToSAXHandler.java,v 1.2.4.1 2005/09/22 11:03:15 pvedula Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
 import java.util.ArrayList;
-
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.ErrorHandler;
@@ -39,23 +36,16 @@
  *
  * @xsl.usage internal
  */
-public abstract class ToSAXHandler extends SerializerBase
-{
-    public ToSAXHandler()
-    {
-    }
+public abstract class ToSAXHandler extends SerializerBase {
+    public ToSAXHandler() { }
 
-    public ToSAXHandler(
-        ContentHandler hdlr,
-        LexicalHandler lex,
-        String encoding)
-    {
+    public ToSAXHandler(ContentHandler hdlr, LexicalHandler lex, String encoding) {
         setContentHandler(hdlr);
         setLexHandler(lex);
         setEncoding(encoding);
     }
-    public ToSAXHandler(ContentHandler handler, String encoding)
-    {
+
+    public ToSAXHandler(ContentHandler handler, String encoding) {
         setContentHandler(handler);
         setEncoding(encoding);
     }
@@ -90,16 +80,14 @@
     /**
      * Pass callback to the SAX Handler
      */
-    protected void startDocumentInternal() throws SAXException
-    {
-        if (m_needToCallStartDocument)
-        {
+    protected void startDocumentInternal() throws SAXException {
+        if (m_needToCallStartDocument) {
             super.startDocumentInternal();
-
             m_saxHandler.startDocument();
             m_needToCallStartDocument = false;
         }
     }
+
     /**
      * Do nothing.
      * @see org.xml.sax.ext.LexicalHandler#startDTD(String, String, String)
@@ -113,20 +101,20 @@
     /**
      * Receive notification of character data.
      *
-     * @param characters The string of characters to process.
+     * @param chars The string of characters to process.
      *
      * @throws org.xml.sax.SAXException
      *
      * @see ExtendedContentHandler#characters(String)
      */
-    public void characters(String characters) throws SAXException
-    {
-        final int len = characters.length();
-        if (len > m_charsBuff.length)
-        {
-           m_charsBuff = new char[len*2 + 1];
+    public void characters(String chars) throws SAXException {
+        final int len = (chars == null) ? 0 : chars.length();
+        if (len > m_charsBuff.length) {
+            m_charsBuff = new char[len * 2 + 1];
         }
-        characters.getChars(0,len, m_charsBuff, 0);
+        if (len > 0) {
+            chars.getChars(0, len, m_charsBuff, 0);
+        }
         characters(m_charsBuff, 0, len);
     }
 
@@ -135,16 +123,13 @@
      *
      * @see ExtendedLexicalHandler#comment(String)
      */
-    public void comment(String comment) throws SAXException
-    {
+    public void comment(String comment) throws SAXException {
         flushPending();
 
         // Ignore if a lexical handler has not been set
-        if (m_lexHandler != null)
-        {
+        if (m_lexHandler != null) {
             final int len = comment.length();
-            if (len > m_charsBuff.length)
-            {
+            if (len > m_charsBuff.length) {
                m_charsBuff = new char[len*2 + 1];
             }
             comment.getChars(0,len, m_charsBuff, 0);
@@ -153,7 +138,6 @@
             if (m_tracer != null)
                 super.fireCommentEvent(m_charsBuff, 0, len);
         }
-
     }
 
     /**
@@ -167,12 +151,10 @@
         // Redefined in SAXXMLOutput
     }
 
-    protected void closeStartTag() throws SAXException
-    {
+    protected void closeStartTag() throws SAXException {
     }
 
-    protected void closeCDATA() throws SAXException
-    {
+    protected void closeCDATA() throws SAXException {
         // Redefined in SAXXMLOutput
     }
 
@@ -191,12 +173,8 @@
      *
      * @see org.xml.sax.ContentHandler#startElement(String,String,String,Attributes)
      */
-    public void startElement(
-        String arg0,
-        String arg1,
-        String arg2,
-        Attributes arg3)
-        throws SAXException
+    public void startElement(String arg0, String arg1, String arg2,
+                             Attributes arg3) throws SAXException
     {
         if (m_state != null) {
             m_state.resetState(getTransformer());
@@ -211,8 +189,7 @@
      * Sets the LexicalHandler.
      * @param _lexHandler The LexicalHandler to set
      */
-    public void setLexHandler(LexicalHandler _lexHandler)
-    {
+    public void setLexHandler(LexicalHandler _lexHandler) {
         this.m_lexHandler = _lexHandler;
     }
 
@@ -220,11 +197,9 @@
      * Sets the SAX ContentHandler.
      * @param _saxHandler The ContentHandler to set
      */
-    public void setContentHandler(ContentHandler _saxHandler)
-    {
+    public void setContentHandler(ContentHandler _saxHandler) {
         this.m_saxHandler = _saxHandler;
-        if (m_lexHandler == null && _saxHandler instanceof LexicalHandler)
-        {
+        if (m_lexHandler == null && _saxHandler instanceof LexicalHandler) {
             // we are not overwriting an existing LexicalHandler, and _saxHandler
             // is also implements LexicalHandler, so lets use it
             m_lexHandler = (LexicalHandler) _saxHandler;
@@ -236,8 +211,7 @@
      * stream serializers.
      * @see SerializationHandler#setCdataSectionElements(java.util.ArrayList<String>)
      */
-    public void setCdataSectionElements(ArrayList<String> URI_and_localNames)
-    {
+    public void setCdataSectionElements(ArrayList<String> URI_and_localNames) {
         // do nothing
     }
 
@@ -247,8 +221,7 @@
      * @param doOutputNSAttr whether or not namespace declarations
      * should appear as attributes
      */
-    public void setShouldOutputNSAttr(boolean doOutputNSAttr)
-    {
+    public void setShouldOutputNSAttr(boolean doOutputNSAttr) {
         m_shouldGenerateNSAttribute = doOutputNSAttr;
     }
 
@@ -258,8 +231,7 @@
      * also be mirrored with self generated additional attributes of elements
      * that declare the namespace, for example the attribute xmlns:prefix1="uri1"
      */
-    boolean getShouldOutputNSAttr()
-    {
+    boolean getShouldOutputNSAttr() {
         return m_shouldGenerateNSAttribute;
     }
 
@@ -267,27 +239,21 @@
      * This method flushes any pending events, which can be startDocument()
      * closing the opening tag of an element, or closing an open CDATA section.
      */
-    public void flushPending() throws SAXException
-    {
-
-            if (m_needToCallStartDocument)
-            {
+    public void flushPending() throws SAXException {
+            if (m_needToCallStartDocument) {
                 startDocumentInternal();
                 m_needToCallStartDocument = false;
             }
 
-            if (m_elemContext.m_startTagOpen)
-            {
+            if (m_elemContext.m_startTagOpen) {
                 closeStartTag();
                 m_elemContext.m_startTagOpen = false;
             }
 
-            if (m_cdataTagOpen)
-            {
+            if (m_cdataTagOpen) {
                 closeCDATA();
                 m_cdataTagOpen = false;
             }
-
     }
 
     /**
@@ -350,8 +316,7 @@
         throws org.xml.sax.SAXException
     {
         // remember the current node
-        if (m_state != null)
-        {
+        if (m_state != null) {
             m_state.setCurrentNode(node);
         }
 
@@ -392,12 +357,10 @@
      */
     public void warning(SAXParseException exc) throws SAXException {
         super.warning(exc);
-
         if (m_saxHandler instanceof ErrorHandler)
             ((ErrorHandler)m_saxHandler).warning(exc);
     }
 
-
     /**
      * Try's to reset the super class and reset this class for
      * re-use, so that you don't need to create a new serializer
@@ -406,11 +369,9 @@
      * @return true if the class was successfuly reset.
      * @see Serializer#reset()
      */
-    public boolean reset()
-    {
+    public boolean reset() {
         boolean wasReset = false;
-        if (super.reset())
-        {
+        if (super.reset()) {
             resetToSAXHandler();
             wasReset = true;
         }
@@ -421,8 +382,7 @@
      * Reset all of the fields owned by ToSAXHandler class
      *
      */
-    private void resetToSAXHandler()
-    {
+    private void resetToSAXHandler() {
         this.m_lexHandler = null;
         this.m_saxHandler = null;
         this.m_state = null;
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToStream.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,15 +1,13 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -19,12 +17,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: ToStream.java,v 1.4 2005/11/10 06:43:26 suresh_emailid Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
 import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
+import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
+import com.sun.org.apache.xml.internal.serializer.utils.Utils;
+import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -36,30 +35,22 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.ArrayList;
-
 import javax.xml.transform.ErrorListener;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
-
-import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
-import com.sun.org.apache.xml.internal.serializer.utils.Utils;
-import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
 import org.w3c.dom.Node;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
-//import com.sun.media.sound.IESecurity;
-
 /**
  * This abstract class is a base class for other stream
  * serializers (xml, html, text ...) that write output to a stream.
  *
  * @xsl.usage internal
  */
-abstract public class ToStream extends SerializerBase
-{
+abstract public class ToStream extends SerializerBase {
 
     private static final String COMMENT_BEGIN = "<!--";
     private static final String COMMENT_END = "-->";
@@ -67,7 +58,6 @@
     /** Stack to keep track of disabling output escaping. */
     protected BoolStack m_disableOutputEscapingStates = new BoolStack();
 
-
     /**
      * The encoding information associated with this serializer.
      * Although initially there is no encoding,
@@ -87,21 +77,17 @@
      */
     java.lang.reflect.Method m_canConvertMeth;
 
-
-
     /**
      * Boolean that tells if we already tried to get the converter.
      */
     boolean m_triedToGetConverter = false;
 
-
     /**
      * Opaque reference to the sun.io.CharToByteConverter for this
      * encoding.
      */
     Object m_charToByteConverter = null;
 
-
     /**
      * Stack to keep track of whether or not we need to
      * preserve whitespace.
@@ -139,7 +125,6 @@
      */
     protected int m_maxCharacter = Encodings.getLastPrintable();
 
-
     /**
      * The system line separator for writing out line breaks.
      * The default value is from the system property,
@@ -188,8 +173,8 @@
     protected boolean m_inDoctype = false;
 
     /**
-       * Flag to quickly tell if the encoding is UTF8.
-       */
+     * Flag to quickly tell if the encoding is UTF8.
+     */
     boolean m_isUTF8 = false;
 
     /**
@@ -203,29 +188,23 @@
      */
     private boolean m_expandDTDEntities = true;
 
-
     /**
      * Default constructor
      */
-    public ToStream()
-    {
-    }
+    public ToStream() { }
 
     /**
      * This helper method to writes out "]]>" when closing a CDATA section.
      *
      * @throws org.xml.sax.SAXException
      */
-    protected void closeCDATA() throws org.xml.sax.SAXException
-    {
-        try
-        {
+    protected void closeCDATA() throws org.xml.sax.SAXException {
+        try {
             m_writer.write(CDATA_DELIMITER_CLOSE);
             // write out a CDATA section closing "]]>"
             m_cdataTagOpen = false; // Remember that we have done so.
         }
-        catch (IOException e)
-        {
+        catch (IOException e) {
             throw new SAXException(e);
         }
     }
@@ -237,18 +216,11 @@
      * @param node Node to serialize.
      * @throws IOException An I/O exception occured while serializing
      */
-    public void serialize(Node node) throws IOException
-    {
-
-        try
-        {
-            TreeWalker walker =
-                new TreeWalker(this);
-
+    public void serialize(Node node) throws IOException {
+        try {
+            TreeWalker walker = new TreeWalker(this);
             walker.traverse(node);
-        }
-        catch (org.xml.sax.SAXException se)
-        {
+        } catch (org.xml.sax.SAXException se) {
             throw new WrappedRuntimeException(se);
         }
     }
@@ -260,8 +232,7 @@
      *
      * NEEDSDOC ($objectName$) @return
      */
-    static final boolean isUTF16Surrogate(char c)
-    {
+    static final boolean isUTF16Surrogate(char c) {
         return (c & 0xFC00) == 0xD800;
     }
 
@@ -275,49 +246,40 @@
      *
      * @throws org.xml.sax.SAXException
      */
-    protected final void flushWriter() throws org.xml.sax.SAXException
-    {
-        final java.io.Writer writer = m_writer;
-        if (null != writer)
-        {
-            try
-            {
-                if (writer instanceof WriterToUTF8Buffered)
-                {
+    protected final void flushWriter() throws org.xml.sax.SAXException {
+        final Writer writer = m_writer;
+        if (null != writer) {
+            try {
+                if (writer instanceof WriterToUTF8Buffered) {
                     if (m_shouldFlush)
-                         ((WriterToUTF8Buffered) writer).flush();
+                        ((WriterToUTF8Buffered)writer).flush();
                     else
-                         ((WriterToUTF8Buffered) writer).flushBuffer();
+                        ((WriterToUTF8Buffered)writer).flushBuffer();
                 }
-                if (writer instanceof WriterToASCI)
-                {
+                if (writer instanceof WriterToASCI) {
                     if (m_shouldFlush)
                         writer.flush();
-                }
-                else
-                {
+                } else {
                     // Flush always.
                     // Not a great thing if the writer was created
                     // by this class, but don't have a choice.
                     writer.flush();
                 }
-            }
-            catch (IOException ioe)
-            {
+            } catch (IOException ioe) {
                 throw new org.xml.sax.SAXException(ioe);
             }
         }
     }
 
     OutputStream m_outputStream;
+
     /**
      * Get the output stream where the events will be serialized to.
      *
      * @return reference to the result stream, or null of only a writer was
      * set.
      */
-    public OutputStream getOutputStream()
-    {
+    public OutputStream getOutputStream() {
         return m_outputStream;
     }
 
@@ -341,9 +303,8 @@
         // Do not inline external DTD
         if (m_inExternalDTD)
             return;
-        try
-        {
-            final java.io.Writer writer = m_writer;
+        try {
+            final Writer writer = m_writer;
             DTDprolog();
 
             writer.write("<!ELEMENT ");
@@ -379,13 +340,10 @@
         // Do not inline external DTD
         if (m_inExternalDTD)
             return;
-        try
-        {
+        try {
             DTDprolog();
             outputEntityDecl(name, value);
-        }
-        catch (IOException e)
-        {
+        } catch (IOException e) {
             throw new SAXException(e);
         }
 
@@ -401,7 +359,7 @@
      */
     void outputEntityDecl(String name, String value) throws IOException
     {
-        final java.io.Writer writer = m_writer;
+        final Writer writer = m_writer;
         writer.write("<!ENTITY ");
         writer.write(name);
         writer.write(" \"");
@@ -415,8 +373,7 @@
      *
      * @throws org.xml.sax.SAXException
      */
-    protected final void outputLineSep() throws IOException
-    {
+    protected final void outputLineSep() throws IOException {
         m_writer.write(m_lineSep, 0, m_lineSepLen);
     }
 
@@ -594,20 +551,17 @@
      *
      * @param format The output format to use
      */
-    public void setOutputFormat(Properties format)
-    {
+    public void setOutputFormat(Properties format) {
         boolean shouldFlush = m_shouldFlush;
 
-        if (format != null)
-        {
+        if (format != null) {
             // Set the default values first,
             // and the non-default values after that,
             // just in case there is some unexpected
             // residual values left over from over-ridden default values
             Enumeration propNames;
             propNames = format.propertyNames();
-            while (propNames.hasMoreElements())
-            {
+            while (propNames.hasMoreElements()) {
                 String key = (String) propNames.nextElement();
                 // Get the value, possibly a default value
                 String value = format.getProperty(key);
@@ -629,18 +583,11 @@
         String entitiesFileName =
             (String) format.get(OutputPropertiesFactory.S_KEY_ENTITIES);
 
-        if (null != entitiesFileName)
-        {
-
-            String method =
-                (String) format.get(OutputKeys.METHOD);
-
+        if (null != entitiesFileName) {
+            String method = (String) format.get(OutputKeys.METHOD);
             m_charInfo = CharInfo.getCharInfo(entitiesFileName, method);
         }
 
-
-
-
         m_shouldFlush = shouldFlush;
     }
 
@@ -678,8 +625,7 @@
      *
      * @param writer The output writer stream
      */
-    public void setWriter(Writer writer)
-    {
+    public void setWriter(Writer writer) {
         setWriterInternal(writer, true);
     }
 
@@ -716,8 +662,7 @@
      * operating systems end-of-line separator.
      * @return The previously set value of the serializer.
      */
-    public boolean setLineSepUse(boolean use_sytem_line_break)
-    {
+    public boolean setLineSepUse(boolean use_sytem_line_break) {
         boolean oldValue = m_lineSepUse;
         m_lineSepUse = use_sytem_line_break;
         return oldValue;
@@ -734,8 +679,7 @@
      *
      * @param output The output stream
      */
-    public void setOutputStream(OutputStream output)
-    {
+    public void setOutputStream(OutputStream output) {
         setOutputStreamInternal(output, true);
     }
 
@@ -848,7 +792,7 @@
      */
     private void printSpace(int n) throws IOException
     {
-        final java.io.Writer writer = m_writer;
+        final Writer writer = m_writer;
         for (int i = 0; i < n; i++)
         {
             writer.write(' ');
@@ -888,7 +832,7 @@
             return;
         try
         {
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             DTDprolog();
 
             writer.write("<!ATTLIST ");
@@ -1038,7 +982,7 @@
                             + Integer.toHexString(low)}));
         }
 
-        final java.io.Writer writer = m_writer;
+        final Writer writer = m_writer;
 
         // If we make it to here we have a valid high, low surrogate pair
         if (m_encodingInfo.isInEncoding(c,low)) {
@@ -1089,7 +1033,7 @@
      * @throws java.io.IOException
      */
     protected int accumDefaultEntity(
-        java.io.Writer writer,
+        Writer writer,
         char ch,
         int i,
         char[] chars,
@@ -1146,7 +1090,7 @@
         boolean useSystemLineSeparator)
         throws IOException, org.xml.sax.SAXException
     {
-        final java.io.Writer writer = m_writer;
+        final Writer writer = m_writer;
         int end = start + length;
 
         for (int i = start; i < end; i++)
@@ -1855,7 +1799,7 @@
 
             m_startNewLine = true;
 
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             writer.write('<');
             writer.write(name);
         }
@@ -1926,7 +1870,7 @@
             closeCDATA();
         try
         {
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             writer.write("<!DOCTYPE ");
             writer.write(name);
 
@@ -1987,7 +1931,7 @@
      * @throws java.io.IOException
      * @throws org.xml.sax.SAXException
      */
-    public void processAttributes(java.io.Writer writer, int nAttrs) throws IOException, SAXException
+    public void processAttributes(Writer writer, int nAttrs) throws IOException, SAXException
     {
             /* real SAX attributes are not passed in, so process the
              * attributes that were collected after the startElement call.
@@ -2084,7 +2028,7 @@
 
         try
         {
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             if (m_elemContext.m_startTagOpen)
             {
                 if (m_tracer != null)
@@ -2290,7 +2234,7 @@
             if (shouldIndent() && !m_isStandalone)
                 indent();
 
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             writer.write(COMMENT_BEGIN);
             // Detect occurrences of two consecutive dashes, handle as necessary.
             for (int i = start; i < limit; i++)
@@ -2370,7 +2314,7 @@
                 outputDocTypeDecl(m_elemContext.m_elementName, false);
                 m_needToOutputDocTypeDecl = false;
             }
-            final java.io.Writer writer = m_writer;
+            final Writer writer = m_writer;
             if (!m_inDoctype)
                 writer.write("]>");
             else
@@ -2598,15 +2542,12 @@
      * OutputProperties. Eventually this method should go away and a call
      * to setCdataSectionElements(ArrayList<String> v) should be made directly.
      */
-    private void setCdataSectionElements(String key, Properties props)
-    {
-
+    private void setCdataSectionElements(String key, Properties props) {
         String s = props.getProperty(key);
 
-        if (null != s)
-        {
+        if (null != s) {
             // ArrayList<String> of URI/LocalName pairs
-            ArrayList<String> v = new ArrayList<>();
+            ArrayList<String> al = new ArrayList<>();
             int l = s.length();
             boolean inCurly = false;
             StringBuilder buf = new StringBuilder();
@@ -2624,7 +2565,7 @@
                     {
                         if (buf.length() > 0)
                         {
-                            addCdataSectionElement(buf.toString(), v);
+                            addCdataSectionElement(buf.toString(), al);
                             buf.setLength(0);
                         }
                         continue;
@@ -2640,11 +2581,11 @@
 
             if (buf.length() > 0)
             {
-                addCdataSectionElement(buf.toString(), v);
+                addCdataSectionElement(buf.toString(), al);
                 buf.setLength(0);
             }
             // call the official, public method to set the collected names
-            setCdataSectionElements(v);
+            setCdataSectionElements(al);
         }
 
     }
@@ -2656,25 +2597,19 @@
      *
      * @return a QName object
      */
-    private void addCdataSectionElement(String URI_and_localName, ArrayList<String> v)
-    {
-
-        StringTokenizer tokenizer =
-            new StringTokenizer(URI_and_localName, "{}", false);
+    private void addCdataSectionElement(String URI_and_localName, ArrayList<String> al) {
+        StringTokenizer tokenizer = new StringTokenizer(URI_and_localName, "{}", false);
         String s1 = tokenizer.nextToken();
         String s2 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
 
-        if (null == s2)
-        {
+        if (null == s2) {
             // add null URI and the local name
-            v.add(null);
-            v.add(s1);
-        }
-        else
-        {
+            al.add(null);
+            al.add(s1);
+        } else {
             // add URI, then local name
-            v.add(s1);
-            v.add(s2);
+            al.add(s1);
+            al.add(s2);
         }
     }
 
@@ -2685,25 +2620,20 @@
      *
      * @param URI_and_localNames an ArrayList of pairs of Strings (URI/local)
      */
-    public void setCdataSectionElements(ArrayList<String> URI_and_localNames)
-    {
+    public void setCdataSectionElements(ArrayList<String> URI_and_localNames) {
         // convert to the new way.
-        if (URI_and_localNames != null)
-        {
+        if (URI_and_localNames != null) {
             final int len = URI_and_localNames.size() - 1;
-            if (len > 0)
-            {
+            if (len > 0) {
                 final StringBuilder sb = new StringBuilder();
-                for (int i = 0; i < len; i += 2)
-                {
+                for (int i = 0; i < len; i += 2) {
                     // whitspace separated "{uri1}local1 {uri2}local2 ..."
                     if (i != 0)
                         sb.append(' ');
                     final String uri = (String) URI_and_localNames.get(i);
                     final String localName =
                         (String) URI_and_localNames.get(i + 1);
-                    if (uri != null)
-                    {
+                    if (uri != null) {
                         // If there is no URI don't put this in, just the localName then.
                         sb.append('{');
                         sb.append(uri);
@@ -3007,25 +2937,19 @@
      * exist. This method should be called everytime an attribute is added,
      * or when an attribute value is changed, or an element is created.
      */
-
-    protected void firePseudoAttributes()
-    {
-        if (m_tracer != null)
-        {
-            try
-            {
+    protected void firePseudoAttributes() {
+        if (m_tracer != null) {
+            try {
                 // flush out the "<elemName" if not already flushed
                 m_writer.flush();
 
                 // make a StringBuffer to write the name="value" pairs to.
                 StringBuffer sb = new StringBuffer();
                 int nAttrs = m_attributes.getLength();
-                if (nAttrs > 0)
-                {
+                if (nAttrs > 0) {
                     // make a writer that internally appends to the same
                     // StringBuffer
-                    java.io.Writer writer =
-                        new ToStream.WritertoStringBuffer(sb);
+                    Writer writer = new ToStream.WritertoStringBuffer(sb);
 
                     processAttributes(writer, nAttrs);
                     // Don't clear the attributes!
@@ -3042,13 +2966,9 @@
                     ch,
                     0,
                     ch.length);
-            }
-            catch (IOException ioe)
-            {
+            } catch (IOException ioe) {
                 // ignore ?
-            }
-            catch (SAXException se)
-            {
+            } catch (SAXException se) {
                 // ignore ?
             }
         }
@@ -3060,41 +2980,35 @@
      * In this manner trace events, and the real writing of attributes will use
      * the same code.
      */
-    private class WritertoStringBuffer extends java.io.Writer
-    {
+    private class WritertoStringBuffer extends Writer {
         final private StringBuffer m_stringbuf;
+
         /**
          * @see java.io.Writer#write(char[], int, int)
          */
-        WritertoStringBuffer(StringBuffer sb)
-        {
+        WritertoStringBuffer(StringBuffer sb) {
             m_stringbuf = sb;
         }
 
-        public void write(char[] arg0, int arg1, int arg2) throws IOException
-        {
+        public void write(char[] arg0, int arg1, int arg2) throws IOException {
             m_stringbuf.append(arg0, arg1, arg2);
         }
+
         /**
          * @see java.io.Writer#flush()
          */
-        public void flush() throws IOException
-        {
-        }
+        public void flush() throws IOException {}
+
         /**
          * @see java.io.Writer#close()
          */
-        public void close() throws IOException
-        {
-        }
-
-        public void write(int i)
-        {
+        public void close() throws IOException {}
+
+        public void write(int i) {
             m_stringbuf.append((char) i);
         }
 
-        public void write(String s)
-        {
+        public void write(String s) {
             m_stringbuf.append(s);
         }
     }
@@ -3104,12 +3018,11 @@
      */
     public void setTransformer(Transformer transformer) {
         super.setTransformer(transformer);
-        if (m_tracer != null
-         && !(m_writer instanceof SerializerTraceWriter)  )
+        if (m_tracer != null && !(m_writer instanceof SerializerTraceWriter)) {
             m_writer = new SerializerTraceWriter(m_writer, m_tracer);
-
-
+        }
     }
+
     /**
      * Try's to reset the super class and reset this class for
      * re-use, so that you don't need to create a new serializer
@@ -3117,11 +3030,9 @@
      *
      * @return true if the class was successfuly reset.
      */
-    public boolean reset()
-    {
+    public boolean reset() {
         boolean wasReset = false;
-        if (super.reset())
-        {
+        if (super.reset()) {
             resetToStream();
             wasReset = true;
         }
@@ -3132,14 +3043,12 @@
      * Reset all of the fields owned by ToStream class
      *
      */
-    private void resetToStream()
-    {
+    private void resetToStream() {
          this.m_cdataStartCalled = false;
          /* The stream is being reset. It is one of
           * ToXMLStream, ToHTMLStream ... and this type can't be changed
           * so neither should m_charInfo which is associated with the
           * type of Stream. Just leave m_charInfo as-is for the next re-use.
-          *
           */
          // this.m_charInfo = null; // don't set to null
 
@@ -3183,173 +3092,150 @@
      *
      * @xsl.usage internal
      */
-    static final class BoolStack
-    {
-
-      /** Array of boolean values          */
-      private boolean m_values[];
-
-      /** Array size allocated           */
-      private int m_allocatedSize;
-
-      /** Index into the array of booleans          */
-      private int m_index;
-
-      /**
-       * Default constructor.  Note that the default
-       * block size is very small, for small lists.
-       */
-      public BoolStack()
-      {
-        this(32);
-      }
-
-      /**
-       * Construct a IntVector, using the given block size.
-       *
-       * @param size array size to allocate
-       */
-      public BoolStack(int size)
-      {
-
-        m_allocatedSize = size;
-        m_values = new boolean[size];
-        m_index = -1;
-      }
-
-      /**
-       * Get the length of the list.
-       *
-       * @return Current length of the list
-       */
-      public final int size()
-      {
-        return m_index + 1;
-      }
-
-      /**
-       * Clears the stack.
-       *
-       */
-      public final void clear()
-      {
-        m_index = -1;
-      }
-
-      /**
-       * Pushes an item onto the top of this stack.
-       *
-       *
-       * @param val the boolean to be pushed onto this stack.
-       * @return  the <code>item</code> argument.
-       */
-      public final boolean push(boolean val)
-      {
-
-        if (m_index == m_allocatedSize - 1)
-          grow();
-
-        return (m_values[++m_index] = val);
-      }
-
-      /**
-       * Removes the object at the top of this stack and returns that
-       * object as the value of this function.
-       *
-       * @return     The object at the top of this stack.
-       * @throws  EmptyStackException  if this stack is empty.
-       */
-      public final boolean pop()
-      {
-        return m_values[m_index--];
-      }
-
-      /**
-       * Removes the object at the top of this stack and returns the
-       * next object at the top as the value of this function.
-       *
-       *
-       * @return Next object to the top or false if none there
-       */
-      public final boolean popAndTop()
-      {
-
-        m_index--;
-
-        return (m_index >= 0) ? m_values[m_index] : false;
-      }
-
-      /**
-       * Set the item at the top of this stack
-       *
-       *
-       * @param b Object to set at the top of this stack
-       */
-      public final void setTop(boolean b)
-      {
-        m_values[m_index] = b;
-      }
-
-      /**
-       * Looks at the object at the top of this stack without removing it
-       * from the stack.
-       *
-       * @return     the object at the top of this stack.
-       * @throws  EmptyStackException  if this stack is empty.
-       */
-      public final boolean peek()
-      {
-        return m_values[m_index];
-      }
-
-      /**
-       * Looks at the object at the top of this stack without removing it
-       * from the stack.  If the stack is empty, it returns false.
-       *
-       * @return     the object at the top of this stack.
-       */
-      public final boolean peekOrFalse()
-      {
-        return (m_index > -1) ? m_values[m_index] : false;
-      }
-
-      /**
-       * Looks at the object at the top of this stack without removing it
-       * from the stack.  If the stack is empty, it returns true.
-       *
-       * @return     the object at the top of this stack.
-       */
-      public final boolean peekOrTrue()
-      {
-        return (m_index > -1) ? m_values[m_index] : true;
-      }
-
-      /**
-       * Tests if this stack is empty.
-       *
-       * @return  <code>true</code> if this stack is empty;
-       *          <code>false</code> otherwise.
-       */
-      public boolean isEmpty()
-      {
-        return (m_index == -1);
-      }
-
-      /**
-       * Grows the size of the stack
-       *
-       */
-      private void grow()
-      {
-
-        m_allocatedSize *= 2;
-
-        boolean newVector[] = new boolean[m_allocatedSize];
-
-        System.arraycopy(m_values, 0, newVector, 0, m_index + 1);
-
-        m_values = newVector;
-      }
+    static final class BoolStack {
+        /** Array of boolean values */
+        private boolean m_values[];
+
+        /** Array size allocated */
+        private int m_allocatedSize;
+
+        /** Index into the array of booleans */
+        private int m_index;
+
+        /**
+         * Default constructor.  Note that the default
+         * block size is very small, for small lists.
+         */
+        public BoolStack() {
+            this(32);
+        }
+
+        /**
+         * Construct a IntVector, using the given block size.
+         *
+         * @param size array size to allocate
+         */
+        public BoolStack(int size) {
+            m_allocatedSize = size;
+            m_values = new boolean[size];
+            m_index = -1;
+        }
+
+        /**
+         * Get the length of the list.
+         *
+         * @return Current length of the list
+         */
+        public final int size() {
+            return m_index + 1;
+        }
+
+        /**
+         * Clears the stack.
+         *
+         */
+        public final void clear() {
+            m_index = -1;
+        }
+
+        /**
+         * Pushes an item onto the top of this stack.
+         *
+         *
+         * @param val the boolean to be pushed onto this stack.
+         * @return  the <code>item</code> argument.
+         */
+        public final boolean push(boolean val) {
+            if (m_index == m_allocatedSize - 1)
+                grow();
+
+            return (m_values[++m_index] = val);
+        }
+
+        /**
+         * Removes the object at the top of this stack and returns that
+         * object as the value of this function.
+         *
+         * @return     The object at the top of this stack.
+         * @throws  EmptyStackException  if this stack is empty.
+         */
+        public final boolean pop() {
+            return m_values[m_index--];
+        }
+
+        /**
+         * Removes the object at the top of this stack and returns the
+         * next object at the top as the value of this function.
+         *
+         *
+         * @return Next object to the top or false if none there
+         */
+        public final boolean popAndTop() {
+            m_index--;
+            return (m_index >= 0) ? m_values[m_index] : false;
+        }
+
+        /**
+         * Set the item at the top of this stack
+         *
+         *
+         * @param b Object to set at the top of this stack
+         */
+        public final void setTop(boolean b) {
+            m_values[m_index] = b;
+        }
+
+        /**
+         * Looks at the object at the top of this stack without removing it
+         * from the stack.
+         *
+         * @return     the object at the top of this stack.
+         * @throws  EmptyStackException  if this stack is empty.
+         */
+        public final boolean peek() {
+            return m_values[m_index];
+        }
+
+        /**
+         * Looks at the object at the top of this stack without removing it
+         * from the stack.  If the stack is empty, it returns false.
+         *
+         * @return     the object at the top of this stack.
+         */
+        public final boolean peekOrFalse() {
+            return (m_index > -1) ? m_values[m_index] : false;
+        }
+
+        /**
+         * Looks at the object at the top of this stack without removing it
+         * from the stack.  If the stack is empty, it returns true.
+         *
+         * @return     the object at the top of this stack.
+         */
+        public final boolean peekOrTrue() {
+            return (m_index > -1) ? m_values[m_index] : true;
+        }
+
+        /**
+         * Tests if this stack is empty.
+         *
+         * @return  <code>true</code> if this stack is empty;
+         *          <code>false</code> otherwise.
+         */
+        public boolean isEmpty() {
+            return (m_index == -1);
+        }
+
+        /**
+         * Grows the size of the stack
+         *
+         */
+        private void grow() {
+            m_allocatedSize *= 2;
+            boolean newVector[] = new boolean[m_allocatedSize];
+            System.arraycopy(m_values, 0, newVector, 0, m_index + 1);
+            m_values = newVector;
+        }
     }
 
     // Implement DTDHandler
@@ -3421,14 +3307,12 @@
      * @throws IOException
      */
     private void DTDprolog() throws SAXException, IOException {
-        final java.io.Writer writer = m_writer;
-        if (m_needToOutputDocTypeDecl)
-        {
+        final Writer writer = m_writer;
+        if (m_needToOutputDocTypeDecl) {
             outputDocTypeDecl(m_elemContext.m_elementName, false);
             m_needToOutputDocTypeDecl = false;
         }
-        if (m_inDoctype)
-        {
+        if (m_inDoctype) {
             writer.write(" [");
             writer.write(m_lineSep, 0, m_lineSepLen);
             m_inDoctype = false;
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java	Wed Nov 23 19:15:33 2016 +0000
@@ -1,13 +1,13 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -17,9 +17,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: ToUnknownStream.java,v 1.3 2005/09/28 13:49:08 pvedula Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
 import java.io.IOException;
@@ -27,17 +25,14 @@
 import java.io.Writer;
 import java.util.Properties;
 import java.util.ArrayList;
-
 import javax.xml.transform.SourceLocator;
 import javax.xml.transform.Transformer;
-
 import org.w3c.dom.Node;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 
-
 /**
  *This class wraps another SerializationHandler. The wrapped object will either
  * handler XML or HTML, which is not known until a little later when the first XML
@@ -55,7 +50,6 @@
  */
 public final class ToUnknownStream extends SerializerBase
 {
-
     /**
      * The wrapped handler, initially XML but possibly switched to HTML
      */
@@ -71,11 +65,11 @@
      */
     private boolean m_wrapped_handler_not_initialized = false;
 
-
     /**
      * the prefix of the very first tag in the document
      */
     private String m_firstElementPrefix;
+
     /**
      * the element name (including any prefix) of the very first tag in the document
      */
@@ -101,6 +95,7 @@
      * _namespacePrefix has the matching prefix for these URI's
      */
     private ArrayList<String> m_namespaceURI = null;
+
     /**
      * A collection of namespace Prefix (only for first element)
      * _namespaceURI has the matching URIs for these prefix'
@@ -112,34 +107,13 @@
      * was initialized
      */
     private boolean m_needToCallStartDocument = false;
-    /**
-     * true if setVersion() was called before the underlying handler
-     * was initialized
-     */
-    private boolean m_setVersion_called = false;
-    /**
-     * true if setDoctypeSystem() was called before the underlying handler
-     * was initialized
-     */
-    private boolean m_setDoctypeSystem_called = false;
-    /**
-     * true if setDoctypePublic() was called before the underlying handler
-     * was initialized
-     */
-    private boolean m_setDoctypePublic_called = false;
-    /**
-     * true if setMediaType() was called before the underlying handler
-     * was initialized
-     */
-    private boolean m_setMediaType_called = false;
 
     /**
      * Default constructor.
      * Initially this object wraps an XML Stream object, so _handler is never null.
      * That may change later to an HTML Stream object.
      */
-    public ToUnknownStream()
-    {
+    public ToUnknownStream() {
         m_handler = new ToXMLStream();
     }
 
@@ -147,8 +121,7 @@
      * @see Serializer#asContentHandler()
      * @return the wrapped XML or HTML handler
      */
-    public ContentHandler asContentHandler() throws IOException
-    {
+    public ContentHandler asContentHandler() throws IOException {
         /* don't return the real handler ( m_handler ) because
          * that would expose the real handler to the outside.
          * Keep m_handler private so it can be internally swapped
@@ -160,8 +133,7 @@
     /**
      * @see SerializationHandler#close()
      */
-    public void close()
-    {
+    public void close() {
         m_handler.close();
     }
 
@@ -169,8 +141,7 @@
      * @see Serializer#getOutputFormat()
      * @return the properties of the underlying handler
      */
-    public Properties getOutputFormat()
-    {
+    public Properties getOutputFormat() {
         return m_handler.getOutputFormat();
     }
 
@@ -178,8 +149,7 @@
      * @see Serializer#getOutputStream()
      * @return the OutputStream of the underlying XML or HTML handler
      */
-    public OutputStream getOutputStream()
-    {
+    public OutputStream getOutputStream() {
         return m_handler.getOutputStream();
     }
 
@@ -187,8 +157,7 @@
      * @see Serializer#getWriter()
      * @return the Writer of the underlying XML or HTML handler
      */
-    public Writer getWriter()
-    {
+    public Writer getWriter() {
         return m_handler.getWriter();
     }
 
@@ -197,8 +166,7 @@
      * @see Serializer#reset()
      * @return ???
      */
-    public boolean reset()
-    {
+    public boolean reset() {
         return m_handler.reset();
     }
 
@@ -208,10 +176,8 @@
      * @see DOMSerializer#serialize(Node)
      *
      */
-    public void serialize(Node node) throws IOException
-    {
-        if (m_firstTagNotEmitted)
-        {
+    public void serialize(Node node) throws IOException {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.serialize(node);
@@ -220,8 +186,7 @@
     /**
      * @see SerializationHandler#setEscaping(boolean)
      */
-    public boolean setEscaping(boolean escape) throws SAXException
-    {
+    public boolean setEscaping(boolean escape) throws SAXException {
         return m_handler.setEscaping(escape);
     }
 
@@ -230,8 +195,7 @@
      * @param format the output properties to set
      * @see Serializer#setOutputFormat(Properties)
      */
-    public void setOutputFormat(Properties format)
-    {
+    public void setOutputFormat(Properties format) {
         m_handler.setOutputFormat(format);
     }
 
@@ -240,8 +204,7 @@
      * @param output the OutputStream to write to
      * @see Serializer#setOutputStream(OutputStream)
      */
-    public void setOutputStream(OutputStream output)
-    {
+    public void setOutputStream(OutputStream output) {
         m_handler.setOutputStream(output);
     }
 
@@ -250,8 +213,7 @@
      * @param writer the writer to write to
      * @see Serializer#setWriter(Writer)
      */
-    public void setWriter(Writer writer)
-    {
+    public void setWriter(Writer writer) {
         m_handler.setWriter(writer);
     }
 
@@ -265,12 +227,8 @@
      * @param XSLAttribute true if this attribute is coming from an xsl:attribute element
      * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
      */
-    public void addAttribute(
-        String uri,
-        String localName,
-        String rawName,
-        String type,
-        String value)
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value)
         throws SAXException
     {
         addAttribute(uri, localName, rawName, type, value, false);
@@ -286,35 +244,27 @@
      * @param XSLAttribute true if this attribute is coming from an xsl:attribute element
      * @see ExtendedContentHandler#addAttribute(String, String, String, String, String)
      */
-    public void addAttribute(
-        String uri,
-        String localName,
-        String rawName,
-        String type,
-        String value,
-        boolean XSLAttribute)
+    public void addAttribute(String uri, String localName, String rawName,
+                             String type, String value, boolean XSLAttribute)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.addAttribute(uri, localName, rawName, type, value, XSLAttribute);
     }
+
     /**
      * Adds an attribute to the currenly open tag
      * @param rawName the attribute name, with prefix (if any)
      * @param value the value of the parameter
      * @see ExtendedContentHandler#addAttribute(String, String)
      */
-    public void addAttribute(String rawName, String value)
-    {
-        if (m_firstTagNotEmitted)
-        {
+    public void addAttribute(String rawName, String value) {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.addAttribute(rawName, value);
-
     }
 
     /**
@@ -323,52 +273,50 @@
     public void addUniqueAttribute(String rawName, String value, int flags)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.addUniqueAttribute(rawName, value, flags);
-
     }
 
     /**
      * Converts the String to a character array and calls the SAX method
      * characters(char[],int,int);
      *
+     * @param chars The string of characters to process.
+     *
+     * @throws org.xml.sax.SAXException
+     *
      * @see ExtendedContentHandler#characters(String)
      */
-    public void characters(String chars) throws SAXException
-    {
-        final int length = chars.length();
-        if (length > m_charsBuff.length)
-        {
-            m_charsBuff = new char[length*2 + 1];
+    public void characters(String chars) throws SAXException {
+        final int len = (chars == null) ? 0 : chars.length();
+        if (len > m_charsBuff.length) {
+            m_charsBuff = new char[len * 2 + 1];
         }
-        chars.getChars(0, length, m_charsBuff, 0);
-        this.characters(m_charsBuff, 0, length);
+        if (len > 0) {
+            chars.getChars(0, len, m_charsBuff, 0);
+        }
+        this.characters(m_charsBuff, 0, len);
     }
 
     /**
      * Pass the call on to the underlying handler
      * @see ExtendedContentHandler#endElement(String)
      */
-    public void endElement(String elementName) throws SAXException
-    {
-        if (m_firstTagNotEmitted)
-        {
+    public void endElement(String elementName) throws SAXException {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.endElement(elementName);
     }
 
-
     /**
      * @see org.xml.sax.ContentHandler#startPrefixMapping(String, String)
      * @param prefix The prefix that maps to the URI
      * @param uri The URI for the namespace
      */
-    public void startPrefixMapping(String prefix, String uri) throws SAXException
-    {
+    public void startPrefixMapping(String prefix, String uri) throws SAXException {
         this.startPrefixMapping(prefix,uri, true);
     }
 
@@ -387,11 +335,12 @@
         throws SAXException
     {
         // hack for XSLTC with finding URI for default namespace
-        if (m_firstTagNotEmitted && m_firstElementURI == null && m_firstElementName != null)
+        if (m_firstTagNotEmitted &&
+            m_firstElementURI == null &&
+            m_firstElementName != null)
         {
             String prefix1 = getPrefixPart(m_firstElementName);
-            if (prefix1 == null && EMPTYSTRING.equals(prefix))
-            {
+            if (prefix1 == null && EMPTYSTRING.equals(prefix)) {
                 // the elements URI is not known yet, and it
                 // doesn't have a prefix, and we are currently
                 // setting the uri for prefix "", so we have
@@ -399,45 +348,36 @@
                 m_firstElementURI = uri;
             }
         }
-        startPrefixMapping(prefix,uri, false);
+        startPrefixMapping(prefix, uri, false);
     }
 
     public boolean startPrefixMapping(String prefix, String uri, boolean shouldFlush)
         throws SAXException
     {
         boolean pushed = false;
-        if (m_firstTagNotEmitted)
-        {
-            if (m_firstElementName != null && shouldFlush)
-            {
+        if (m_firstTagNotEmitted) {
+            if (m_firstElementName != null && shouldFlush) {
                 /* we've already seen a startElement, and this is a prefix mapping
                  * for the up coming element, so flush the old element
                  * then send this event on its way.
                  */
                 flush();
                 pushed = m_handler.startPrefixMapping(prefix, uri, shouldFlush);
-            }
-            else
-            {
-                if (m_namespacePrefix == null)
-                {
+            } else {
+                if (m_namespacePrefix == null) {
                     m_namespacePrefix = new ArrayList<>();
                     m_namespaceURI = new ArrayList<>();
                 }
                 m_namespacePrefix.add(prefix);
                 m_namespaceURI.add(uri);
 
-                if (m_firstElementURI == null)
-                {
+                if (m_firstElementURI == null) {
                     if (prefix.equals(m_firstElementPrefix))
                         m_firstElementURI = uri;
                 }
             }
-
-        }
-        else
-        {
-           pushed = m_handler.startPrefixMapping(prefix, uri, shouldFlush);
+        } else {
+            pushed = m_handler.startPrefixMapping(prefix, uri, shouldFlush);
         }
         return pushed;
     }
@@ -446,54 +386,39 @@
       * This method cannot be cached because default is different in
       * HTML and XML (we need more than a boolean).
       */
-
-    public void setVersion(String version)
-    {
+    public void setVersion(String version) {
         m_handler.setVersion(version);
-
-        // Cache call to setVersion()
-        //       super.setVersion(version);
-        m_setVersion_called = true;
     }
 
     /**
      * @see org.xml.sax.ContentHandler#startDocument()
      */
-    public void startDocument() throws SAXException
-    {
+    public void startDocument() throws SAXException {
         m_needToCallStartDocument = true;
     }
 
-
-
-    public void startElement(String qName) throws SAXException
-    {
+    public void startElement(String qName) throws SAXException {
         this.startElement(null, null, qName, null);
     }
 
-    public void startElement(String namespaceURI, String localName, String qName) throws SAXException
-    {
+    public void startElement(String namespaceURI, String localName,
+                             String qName) throws SAXException {
         this.startElement(namespaceURI, localName, qName, null);
     }
 
-    public void startElement(
-        String namespaceURI,
-        String localName,
-        String elementName,
-        Attributes atts) throws SAXException
+    public void startElement(String namespaceURI, String localName,
+                             String elementName, Attributes atts)
+        throws SAXException
     {
-
-        if (m_needToCallSetDocumentInfo){
+        if (m_needToCallSetDocumentInfo) {
             super.setDocumentInfo();
             m_needToCallSetDocumentInfo = false;
         }
 
         /* we are notified of the start of an element */
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             /* we have not yet sent the first element on its way */
-            if (m_firstElementName != null)
-            {
+            if (m_firstElementName != null) {
                 /* this is not the first element, but a later one.
                  * But we have the old element pending, so flush it out,
                  * then send this one on its way.
@@ -645,16 +570,14 @@
      * Pass the call on to the underlying handler
      * @see XSLOutputAttributes#getVersion()
      */
-    public String getVersion()
-    {
+    public String getVersion() {
         return m_handler.getVersion();
     }
 
     /**
      * @see XSLOutputAttributes#setDoctype(String, String)
      */
-    public void setDoctype(String system, String pub)
-    {
+    public void setDoctype(String system, String pub) {
         m_handler.setDoctypePublic(pub);
         m_handler.setDoctypeSystem(system);
     }
@@ -665,10 +588,8 @@
      * @param doctype the public doctype to set
      * @see XSLOutputAttributes#setDoctypePublic(String)
      */
-    public void setDoctypePublic(String doctype)
-    {
+    public void setDoctypePublic(String doctype) {
         m_handler.setDoctypePublic(doctype);
-        m_setDoctypePublic_called = true;
     }
 
     /**
@@ -677,18 +598,15 @@
      * @param doctype the system doctype to set
      * @see XSLOutputAttributes#setDoctypeSystem(String)
      */
-    public void setDoctypeSystem(String doctype)
-    {
+    public void setDoctypeSystem(String doctype) {
         m_handler.setDoctypeSystem(doctype);
-        m_setDoctypeSystem_called = true;
     }
 
     /**
      * Pass the call on to the underlying handler
      * @see XSLOutputAttributes#setEncoding(String)
      */
-    public void setEncoding(String encoding)
-    {
+    public void setEncoding(String encoding) {
         m_handler.setEncoding(encoding);
     }
 
@@ -696,34 +614,29 @@
      * Pass the call on to the underlying handler
      * @see XSLOutputAttributes#setIndent(boolean)
      */
-    public void setIndent(boolean indent)
-    {
+    public void setIndent(boolean indent) {
         m_handler.setIndent(indent);
     }
 
     /**
      * Pass the call on to the underlying handler
      */
-    public void setIndentAmount(int value)
-    {
+    public void setIndentAmount(int value) {
         m_handler.setIndentAmount(value);
     }
 
     /**
      * @see XSLOutputAttributes#setMediaType(String)
      */
-    public void setMediaType(String mediaType)
-    {
+    public void setMediaType(String mediaType) {
         m_handler.setMediaType(mediaType);
-        m_setMediaType_called = true;
     }
 
     /**
      * Pass the call on to the underlying handler
      * @see XSLOutputAttributes#setOmitXMLDeclaration(boolean)
      */
-    public void setOmitXMLDeclaration(boolean b)
-    {
+    public void setOmitXMLDeclaration(boolean b) {
         m_handler.setOmitXMLDeclaration(b);
     }
 
@@ -731,27 +644,16 @@
      * Pass the call on to the underlying handler
      * @see XSLOutputAttributes#setStandalone(String)
      */
-    public void setStandalone(String standalone)
-    {
+    public void setStandalone(String standalone) {
         m_handler.setStandalone(standalone);
     }
 
     /**
-     * @see XSLOutputAttributes#setVersion(String)
-     */
-
-    /**
      * Pass the call on to the underlying handler
      * @see org.xml.sax.ext.DeclHandler#attributeDecl(String, String, String, String, String)
      */
-    public void attributeDecl(
-        String arg0,
-        String arg1,
-        String arg2,
-        String arg3,
-        String arg4)
-        throws SAXException
-    {
+    public void attributeDecl(String arg0, String arg1, String arg2,
+                              String arg3, String arg4) throws SAXException {
         m_handler.attributeDecl(arg0, arg1, arg2, arg3, arg4);
     }
 
@@ -761,8 +663,7 @@
      */
     public void elementDecl(String arg0, String arg1) throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             emitFirstTag();
         }
         m_handler.elementDecl(arg0, arg1);
@@ -778,8 +679,7 @@
         String systemId)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.externalEntityDecl(name, publicId, systemId);
@@ -792,8 +692,7 @@
     public void internalEntityDecl(String arg0, String arg1)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
         }
         m_handler.internalEntityDecl(arg0, arg1);
@@ -806,29 +705,21 @@
     public void characters(char[] characters, int offset, int length)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
         }
-
         m_handler.characters(characters, offset, length);
-
     }
 
     /**
      * Pass the call on to the underlying handler
      * @see org.xml.sax.ContentHandler#endDocument()
      */
-    public void endDocument() throws SAXException
-    {
-        if (m_firstTagNotEmitted)
-        {
+    public void endDocument() throws SAXException {
+        if (m_firstTagNotEmitted) {
             flush();
         }
-
         m_handler.endDocument();
-
-
     }
 
     /**
@@ -838,17 +729,14 @@
     public void endElement(String namespaceURI, String localName, String qName)
         throws SAXException
     {
-        if (m_firstTagNotEmitted)
-        {
+        if (m_firstTagNotEmitted) {
             flush();
             if (namespaceURI == null && m_firstElementURI != null)
                 namespaceURI = m_firstElementURI;
 
-
             if (localName == null && m_firstElementLocalName != null)
                 localName = m_firstElementLocalName;
         }
-
         m_handler.endElement(namespaceURI, localName, qName);
     }
 
@@ -856,8 +744,7 @@
      * Pass the call on to the underlying handler
      * @see org.xml.sax.ContentHandler#endPrefixMapping(String)
      */
-    public void endPrefixMapping(String prefix) throws SAXException
-    {
+    public void endPrefixMapping(String prefix) throws SAXException {
         m_handler.endPrefixMapping(prefix);
     }
 
@@ -1071,12 +958,9 @@
         m_wrapped_handler_not_initialized = false;
     }
 
-    private void emitFirstTag() throws SAXException
-    {
-        if (m_firstElementName != null)
-        {
-            if (m_wrapped_handler_not_initialized)
-            {
+    private void emitFirstTag() throws SAXException {
+        if (m_firstElementName != null) {
+            if (m_wrapped_handler_not_initialized) {
                 initStreamOutput();
                 m_wrapped_handler_not_initialized = false;
             }
@@ -1086,14 +970,11 @@
             m_attributes = null;
 
             // Output namespaces of first tag
-            if (m_namespacePrefix != null)
-            {
+            if (m_namespacePrefix != null) {
                 final int n = m_namespacePrefix.size();
-                for (int i = 0; i < n; i++)
-                {
-                    final String prefix =
-                        (String) m_namespacePrefix.get(i);
-                    final String uri = (String) m_namespaceURI.get(i);
+                for (int i = 0; i < n; i++) {
+                    final String prefix = m_namespacePrefix.get(i);
+                    final String uri = m_namespaceURI.get(i);
                     m_handler.startPrefixMapping(prefix, uri, false);
                 }
                 m_namespacePrefix = null;
@@ -1109,8 +990,7 @@
      * Don't want to override static function on SerializerBase
      * So added Unknown suffix to method name.
      */
-    private String getLocalNameUnknown(String value)
-    {
+    private String getLocalNameUnknown(String value) {
         int idx = value.lastIndexOf(':');
         if (idx >= 0)
             value = value.substring(idx + 1);
@@ -1121,13 +1001,12 @@
     }
 
     /**
-         * Utility function to return prefix
-         *
-         * Don't want to override static function on SerializerBase
-         * So added Unknown suffix to method name.
-         */
-    private String getPrefixPartUnknown(String qname)
-    {
+     * Utility function to return prefix
+     *
+     * Don't want to override static function on SerializerBase
+     * So added Unknown suffix to method name.
+     */
+    private String getPrefixPartUnknown(String qname) {
         final int index = qname.indexOf(':');
         return (index > 0) ? qname.substring(0, index) : EMPTYSTRING;
     }
@@ -1139,8 +1018,7 @@
      *
      * @return true if the first element is an opening <html> tag
      */
-    private boolean isFirstElemHTML()
-    {
+    private boolean isFirstElemHTML() {
         boolean isHTML;
 
         // is the first tag html, not considering the prefix ?
@@ -1148,29 +1026,27 @@
             getLocalNameUnknown(m_firstElementName).equalsIgnoreCase("html");
 
         // Try to rule out if this is not to be an HTML document based on URI
-        if (isHTML
-            && m_firstElementURI != null
-            && !EMPTYSTRING.equals(m_firstElementURI))
+        if (isHTML &&
+            m_firstElementURI != null &&
+            !EMPTYSTRING.equals(m_firstElementURI))
         {
             // the <html> element has a non-trivial namespace
             isHTML = false;
         }
         // Try to rule out if this is an not to be an HTML document based on prefix
-        if (isHTML && m_namespacePrefix != null)
-        {
+        if (isHTML && m_namespacePrefix != null) {
             /* the first element has a name of "html", but lets check the prefix.
              * If the prefix points to a namespace with a URL that is not ""
              * then the doecument doesn't start with an <html> tag, and isn't html
              */
             final int max = m_namespacePrefix.size();
-            for (int i = 0; i < max; i++)
-            {
+            for (int i = 0; i < max; i++) {
                 final String prefix = m_namespacePrefix.get(i);
                 final String uri = m_namespaceURI.get(i);
 
-                if (m_firstElementPrefix != null
-                    && m_firstElementPrefix.equals(prefix)
-                    && !EMPTYSTRING.equals(uri))
+                if (m_firstElementPrefix != null &&
+                    m_firstElementPrefix.equals(prefix) &&
+                    !EMPTYSTRING.equals(uri))
                 {
                     // The first element has a prefix, so it can't be <html>
                     isHTML = false;
@@ -1181,11 +1057,11 @@
         }
         return isHTML;
     }
+
     /**
      * @see Serializer#asDOMSerializer()
      */
-    public DOMSerializer asDOMSerializer() throws IOException
-    {
+    public DOMSerializer asDOMSerializer() throws IOException {
         return m_handler.asDOMSerializer();
     }
 
@@ -1194,15 +1070,14 @@
      * specified in the cdata-section-elements attribute.
      * @see SerializationHandler#setCdataSectionElements(java.util.Vector)
      */
-    public void setCdataSectionElements(ArrayList<String> URI_and_localNames)
-    {
+    public void setCdataSectionElements(ArrayList<String> URI_and_localNames) {
         m_handler.setCdataSectionElements(URI_and_localNames);
     }
+
     /**
      * @see ExtendedContentHandler#addAttributes(org.xml.sax.Attributes)
      */
-    public void addAttributes(Attributes atts) throws SAXException
-    {
+    public void addAttributes(Attributes atts) throws SAXException {
         m_handler.addAttributes(atts);
     }
 
@@ -1211,98 +1086,83 @@
      * Simply returns the mappings of the wrapped handler.
      * @see ExtendedContentHandler#getNamespaceMappings()
      */
-    public NamespaceMappings getNamespaceMappings()
-    {
+    public NamespaceMappings getNamespaceMappings() {
         NamespaceMappings mappings = null;
-        if (m_handler != null)
-        {
+        if (m_handler != null) {
             mappings = m_handler.getNamespaceMappings();
         }
         return mappings;
     }
+
     /**
      * @see SerializationHandler#flushPending()
      */
-    public void flushPending() throws SAXException
-    {
-
+    public void flushPending() throws SAXException {
         flush();
-
         m_handler.flushPending();
     }
 
-    private void flush()
-    {
-        try
-        {
-        if (m_firstTagNotEmitted)
-        {
-            emitFirstTag();
-        }
-        if (m_needToCallStartDocument)
-        {
-            m_handler.startDocument();
-            m_needToCallStartDocument = false;
-        }
-        }
-        catch(SAXException e)
-        {
+    private void flush() {
+        try {
+            if (m_firstTagNotEmitted) {
+                emitFirstTag();
+            }
+            if (m_needToCallStartDocument) {
+                m_handler.startDocument();
+                m_needToCallStartDocument = false;
+            }
+        } catch(SAXException e) {
             throw new RuntimeException(e.toString());
         }
-
-
     }
 
     /**
      * @see ExtendedContentHandler#getPrefix
      */
-    public String getPrefix(String namespaceURI)
-    {
+    public String getPrefix(String namespaceURI) {
         return m_handler.getPrefix(namespaceURI);
     }
+
     /**
      * @see ExtendedContentHandler#entityReference(java.lang.String)
      */
-    public void entityReference(String entityName) throws SAXException
-    {
+    public void entityReference(String entityName) throws SAXException {
         m_handler.entityReference(entityName);
     }
 
     /**
      * @see ExtendedContentHandler#getNamespaceURI(java.lang.String, boolean)
      */
-    public String getNamespaceURI(String qname, boolean isElement)
-    {
+    public String getNamespaceURI(String qname, boolean isElement) {
         return m_handler.getNamespaceURI(qname, isElement);
     }
 
-    public String getNamespaceURIFromPrefix(String prefix)
-    {
+    public String getNamespaceURIFromPrefix(String prefix) {
         return m_handler.getNamespaceURIFromPrefix(prefix);
     }
 
-    public void setTransformer(Transformer t)
-    {
+    public void setTransformer(Transformer t) {
         m_handler.setTransformer(t);
         if ((t instanceof SerializerTrace) &&
-            (((SerializerTrace) t).hasTraceListeners())) {
-           m_tracer = (SerializerTrace) t;
+            (((SerializerTrace) t).hasTraceListeners()))
+        {
+            m_tracer = (SerializerTrace) t;
         } else {
-           m_tracer = null;
+            m_tracer = null;
         }
     }
-    public Transformer getTransformer()
-    {
+
+    public Transformer getTransformer() {
         return m_handler.getTransformer();
     }
 
     /**
      * @see SerializationHandler#setContentHandler(org.xml.sax.ContentHandler)
      */
-    public void setContentHandler(ContentHandler ch)
-    {
+    public void setContentHandler(ContentHandler ch) {
         m_handler.setContentHandler(ch);
     }
+
     /**
      * This method is used to set the source locator, which might be used to
      * generated an error message.
@@ -1310,14 +1170,11 @@
      *
      * @see ExtendedContentHandler#setSourceLocator(javax.xml.transform.SourceLocator)
      */
-    public void setSourceLocator(SourceLocator locator)
-    {
+    public void setSourceLocator(SourceLocator locator) {
         m_handler.setSourceLocator(locator);
     }
 
-    protected void firePseudoElement(String elementName)
-    {
-
+    protected void firePseudoElement(String elementName) {
         if (m_tracer != null) {
             StringBuffer sb = new StringBuffer();
 
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/XSLOutputAttributes.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/serializer/XSLOutputAttributes.java	Wed Nov 23 19:15:33 2016 +0000
@@ -3,13 +3,12 @@
  * DO NOT REMOVE OR ALTER!
  */
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the  "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -19,9 +18,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id: XSLOutputAttributes.java,v 1.2.4.1 2005/09/15 08:15:32 suresh_emailid Exp $
- */
+
 package com.sun.org.apache.xml.internal.serializer;
 
 import java.util.ArrayList;
@@ -55,8 +52,7 @@
  *
  * @xsl.usage internal
  */
-interface XSLOutputAttributes
-{
+interface XSLOutputAttributes {
     /**
      * Returns the previously set value of the value to be used as the public
      * identifier in the document type declaration (DTD).
@@ -65,6 +61,7 @@
      * output document.
      */
     public String getDoctypePublic();
+
     /**
      * Returns the previously set value of the value to be used
      * as the system identifier in the document type declaration (DTD).
@@ -73,13 +70,15 @@
      *
      */
     public String getDoctypeSystem();
+
     /**
      * @return the character encoding to be used in the output document.
      */
     public String getEncoding();
+
     /**
-         * @return true if the output document should be indented to visually
-         * indicate its structure.
+     * @return true if the output document should be indented to visually
+     * indicate its structure.
      */
     public boolean getIndent();
 
@@ -87,21 +86,25 @@
      * @return the number of spaces to indent for each indentation level.
      */
     public int getIndentAmount();
+
     /**
      * @return the mediatype the media-type or MIME type associated with the
      * output document.
      */
     public String getMediaType();
+
     /**
      * @return true if the XML declaration is to be omitted from the output
      * document.
      */
     public boolean getOmitXMLDeclaration();
+
     /**
-      * @return a value of "yes" if the <code>standalone</code> delaration is to
-      * be included in the output document.
-      */
+     * @return a value of "yes" if the <code>standalone</code> delaration is to
+     * be included in the output document.
+     */
     public String getStandalone();
+
     /**
      * @return the version of the output format.
      */
@@ -132,20 +135,23 @@
     public void setDoctype(String system, String pub);
 
     /** Set the value coming from the xsl:output doctype-public stylesheet attribute.
-      * @param doctype the public identifier to be used in the DOCTYPE
-      * declaration in the output document.
-      */
+     * @param doctype the public identifier to be used in the DOCTYPE
+     * declaration in the output document.
+     */
     public void setDoctypePublic(String doctype);
+
     /** Set the value coming from the xsl:output doctype-system stylesheet attribute.
-      * @param doctype the system identifier to be used in the DOCTYPE
-      * declaration in the output document.
-      */
+     * @param doctype the system identifier to be used in the DOCTYPE
+     * declaration in the output document.
+     */
     public void setDoctypeSystem(String doctype);
+
     /**
      * Sets the character encoding coming from the xsl:output encoding stylesheet attribute.
      * @param encoding the character encoding
      */
     public void setEncoding(String encoding);
+
     /**
      * Sets the value coming from the xsl:output indent stylesheet
      * attribute.
@@ -153,18 +159,21 @@
      * indicate its structure.
      */
     public void setIndent(boolean indent);
+
     /**
      * Sets the value coming from the xsl:output media-type stylesheet attribute.
      * @param mediatype the media-type or MIME type associated with the output
      * document.
      */
     public void setMediaType(String mediatype);
+
     /**
      * Sets the value coming from the xsl:output omit-xml-declaration stylesheet attribute
      * @param b true if the XML declaration is to be omitted from the output
      * document.
      */
     public void setOmitXMLDeclaration(boolean b);
+
     /**
      * Sets the value coming from the xsl:output standalone stylesheet attribute.
      * @param standalone a value of "yes" indicates that the
@@ -172,6 +181,7 @@
      * document.
      */
     public void setStandalone(String standalone);
+
     /**
      * Sets the value coming from the xsl:output version attribute.
      * @param version the version of the output format.
@@ -194,6 +204,7 @@
      * @return The value of the parameter
      */
     public String getOutputProperty(String name);
+
     /**
      * Get the default value for a property that affects seraialization,
      * or null if there is none. It is possible that a non-default value
@@ -203,6 +214,7 @@
      * @return The default value of the parameter, or null if there is no default value.
      */
     public String getOutputPropertyDefault(String name);
+
     /**
      * Set the non-default value for a property that affects seraialization.
      * @param name The name of the property, which is just the local name
@@ -216,7 +228,7 @@
      * </ul>
      * @val The non-default value of the parameter
      */
-    public void   setOutputProperty(String name, String val);
+    public void setOutputProperty(String name, String val);
 
     /**
      * Set the default value for a property that affects seraialization.
@@ -231,5 +243,5 @@
      * </ul>
      * @val The default value of the parameter
      */
-    public void   setOutputPropertyDefault(String name, String val);
+    public void setOutputPropertyDefault(String name, String val);
 }
--- a/src/java.xml/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/com/sun/org/apache/xml/internal/utils/XMLReaderManager.java	Wed Nov 23 19:15:33 2016 +0000
@@ -81,6 +81,8 @@
     private boolean _useCatalog;
     private CatalogFeatures _catalogFeatures;
 
+    private int _cdataChunkSize;
+
     /**
      * Hidden constructor
      */
@@ -173,13 +175,12 @@
             }
         }
 
-        try {
-            //reader is cached, but this property might have been reset
-            reader.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, _accessExternalDTD);
-        } catch (SAXException se) {
-            XMLSecurityManager.printWarning(reader.getClass().getName(),
-                    XMLConstants.ACCESS_EXTERNAL_DTD, se);
-        }
+        //reader is cached, but this property might have been reset
+        JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, XMLConstants.ACCESS_EXTERNAL_DTD,
+                _accessExternalDTD, true);
+
+        JdkXmlUtils.setXMLReaderPropertyIfSupport(reader, JdkXmlUtils.CDATA_CHUNK_SIZE,
+                _cdataChunkSize, false);
 
         String lastProperty = "";
         try {
@@ -278,7 +279,8 @@
             _xmlSecurityManager = (XMLSecurityManager)value;
         } else if (JdkXmlFeatures.CATALOG_FEATURES.equals(name)) {
             _catalogFeatures = (CatalogFeatures)value;
+        } else if (JdkXmlUtils.CDATA_CHUNK_SIZE.equals(name)) {
+            _cdataChunkSize = JdkXmlUtils.getValue(value, _cdataChunkSize);
         }
-
     }
 }
--- a/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java	Wed Nov 23 19:15:33 2016 +0000
@@ -25,6 +25,7 @@
 
 package jdk.xml.internal;
 
+import com.sun.org.apache.xalan.internal.utils.XMLSecurityManager;
 import com.sun.org.apache.xerces.internal.util.ParserConfigurationSettings;
 import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
 import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
@@ -39,6 +40,7 @@
  * Constants for use across JAXP processors.
  */
 public class JdkXmlUtils {
+
     /**
      * Catalog features
      */
@@ -58,11 +60,63 @@
     /**
      * Default value of USE_CATALOG. This will read the System property
      */
-    public static final boolean USE_CATALOG_DEFAULT =
-            SecuritySupport.getJAXPSystemProperty(SP_USE_CATALOG, true);
+    public static final boolean USE_CATALOG_DEFAULT
+            = SecuritySupport.getJAXPSystemProperty(Boolean.class, SP_USE_CATALOG, "true");
+
+    /**
+     * JDK features (will be consolidated in the next major feature revamp
+     */
+    public final static String CDATA_CHUNK_SIZE = "jdk.xml.cdataChunkSize";
+    public static final int CDATA_CHUNK_SIZE_DEFAULT
+            = SecuritySupport.getJAXPSystemProperty(Integer.class, CDATA_CHUNK_SIZE, "0");
+
+    /**
+     * Returns the value.
+     *
+     * @param value the specified value
+     * @param defValue the default value
+     * @return the value, or the default value if the value is null
+     */
+    public static int getValue(Object value, int defValue) {
+        if (value == null) {
+            return defValue;
+        }
+
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        } else if (value instanceof String) {
+            return Integer.parseInt(String.valueOf(value));
+        } else {
+            throw new IllegalArgumentException("Unexpected class: "
+                    + value.getClass());
+        }
+    }
+
+    /**
+     * Sets the XMLReader instance with the specified property if the the
+     * property is supported, ignores error if not, issues a warning if so
+     * requested.
+     *
+     * @param reader an XMLReader instance
+     * @param property the name of the property
+     * @param value the value of the property
+     * @param warn a flag indicating whether a warning should be issued
+     */
+    public static void setXMLReaderPropertyIfSupport(XMLReader reader, String property,
+            Object value, boolean warn) {
+        try {
+            reader.setProperty(property, value);
+        } catch (SAXNotRecognizedException | SAXNotSupportedException e) {
+            if (warn) {
+                XMLSecurityManager.printWarning(reader.getClass().getName(),
+                        property, e);
+            }
+        }
+    }
 
     /**
      * Returns the value of a Catalog feature by the property name.
+     *
      * @param features a CatalogFeatures instance
      * @param name the name of a Catalog feature
      * @return the value of a Catalog feature, null if the name does not match
@@ -106,10 +160,9 @@
         return builder.build();
     }
 
-
     /**
-     * Passing on the CatalogFeatures settings from one Xerces configuration object
-     * to another.
+     * Passing on the CatalogFeatures settings from one Xerces configuration
+     * object to another.
      *
      * @param config1 a Xerces configuration object
      * @param config2 a Xerces configuration object
@@ -120,14 +173,13 @@
         boolean useCatalog = config1.getFeature(XMLConstants.USE_CATALOG);
         try {
             config2.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog);
-        }
-        catch (XMLConfigurationException e) {
+        } catch (XMLConfigurationException e) {
             supportCatalog = false;
         }
 
         if (supportCatalog && useCatalog) {
             try {
-                for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
+                for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
                     config2.setProperty(f.getPropertyName(), config1.getProperty(f.getPropertyName()));
                 }
             } catch (XMLConfigurationException e) {
@@ -137,8 +189,8 @@
     }
 
     /**
-     * Passing on the CatalogFeatures settings from a Xerces configuration object
-     * to an XMLReader.
+     * Passing on the CatalogFeatures settings from a Xerces configuration
+     * object to an XMLReader.
      *
      * @param config a Xerces configuration object
      * @param reader an XMLReader
@@ -148,14 +200,13 @@
         boolean useCatalog = config.getFeature(XMLConstants.USE_CATALOG);
         try {
             reader.setFeature(JdkXmlUtils.USE_CATALOG, useCatalog);
-        }
-        catch (SAXNotRecognizedException | SAXNotSupportedException e) {
+        } catch (SAXNotRecognizedException | SAXNotSupportedException e) {
             supportCatalog = false;
         }
 
         if (supportCatalog && useCatalog) {
             try {
-                for( CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
+                for (CatalogFeatures.Feature f : CatalogFeatures.Feature.values()) {
                     reader.setProperty(f.getPropertyName(), config.getProperty(f.getPropertyName()));
                 }
             } catch (SAXNotRecognizedException | SAXNotSupportedException e) {
--- a/src/java.xml/share/classes/jdk/xml/internal/SecuritySupport.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/src/java.xml/share/classes/jdk/xml/internal/SecuritySupport.java	Wed Nov 23 19:15:33 2016 +0000
@@ -83,19 +83,26 @@
     }
 
     /**
-     * Reads boolean type system property.
+     * Reads a system property.
      *
+     * @param <T> the type of the property value
+     * @param type the type of the property value
      * @param propName the name of the property
      * @param defValue the default value
      * @return the value of the property, or the default value of no system
      * property is found
      */
-    public static boolean getJAXPSystemProperty(String propName, boolean defValue) {
+    public static <T> T getJAXPSystemProperty(Class<T> type, String propName, String defValue) {
         String value = getJAXPSystemProperty(propName);
         if (value == null) {
-            return defValue;
+            value = defValue;
         }
-        return Boolean.parseBoolean(value);
+        if (Integer.class.isAssignableFrom(type)) {
+            return type.cast(Integer.parseInt(value));
+        } else if (Boolean.class.isAssignableFrom(type)) {
+            return type.cast(Boolean.parseBoolean(value));
+        }
+        return type.cast(value);
     }
 
     /**
--- a/test/Makefile	Wed Nov 23 16:16:35 2016 +0000
+++ b/test/Makefile	Wed Nov 23 19:15:33 2016 +0000
@@ -55,7 +55,7 @@
 UNAME     = uname
 UNIQ      = uniq
 WC        = wc
-ZIP       = zip
+ZIPEXE    = zip
 
 # Get OS name from uname (Cygwin inexplicably adds _NT-5.1)
 UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_)
@@ -130,7 +130,7 @@
 ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)`     \
 	           && $(CD) $(ABS_TEST_OUTPUT_DIR)             \
 	           && $(CHMOD) -R a+r . \
-	           && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
+	           && $(ZIPEXE) -q -r $(ARCHIVE_BUNDLE) . )
 
 # important results files
 SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt")
--- a/test/ProblemList.txt	Wed Nov 23 16:16:35 2016 +0000
+++ b/test/ProblemList.txt	Wed Nov 23 19:15:33 2016 +0000
@@ -23,4 +23,4 @@
 #
 ###########################################################################
 
-javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.sh            8147431 generic-all
+javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.sh            8169827 generic-all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/javax/xml/jaxp/unittest/common/CDataChunkSizeTest.java	Wed Nov 23 19:15:33 2016 +0000
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package common;
+
+import java.io.StringReader;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.events.Characters;
+import javax.xml.stream.events.XMLEvent;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.DefaultHandler2;
+
+/*
+ * @test
+ * @bug 8158619
+ * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
+ * @run testng/othervm -DrunSecMngr=true common.CDataChunkSizeTest
+ * @run testng/othervm common.CDataChunkSizeTest
+ * @summary Verifies the support of property jdk.xml.cdataChunkSize
+ */
+@Listeners({jaxp.library.BasePolicy.class})
+public class CDataChunkSizeTest {
+
+    final static String CDATA_CHUNK_SIZE = "jdk.xml.cdataChunkSize";
+    final static int NO_LIMIT = 0;
+
+    /*
+     * @bug 8158619
+     * Verifies SAXParser's support of the property
+     */
+    @Test(dataProvider = "xml-data")
+    public void testSAX(String xml, int chunkSize, int numOfChunks, boolean withinLimit) throws Exception {
+        SAXParserFactory spf = SAXParserFactory.newInstance();
+        XMLReader reader = spf.newSAXParser().getXMLReader();
+        MyHandler handler = new MyHandler(chunkSize);
+        reader.setContentHandler(handler);
+        reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
+
+        if (chunkSize > 0) {
+            reader.setProperty(CDATA_CHUNK_SIZE, chunkSize);
+        }
+
+        reader.parse(new InputSource(new StringReader(xml)));
+        System.out.println("CData num of chunks:" + handler.getNumOfCDataChunks());
+        System.out.println("CData size within limit:" + handler.chunkSizeWithinLimit());
+        Assert.assertEquals(handler.getNumOfCDataChunks(), numOfChunks);
+        Assert.assertEquals(handler.chunkSizeWithinLimit(), withinLimit);
+
+    }
+
+
+    /*
+     * @bug 8158619
+     * Verifies StAX parser's support of the property
+     */
+    @Test(dataProvider = "xml-data")
+    public void testStAX(String xml, int chunkSize, int expectedNumOfChunks, boolean withinLimit) throws Exception {
+        XMLInputFactory xifactory = XMLInputFactory.newInstance();
+        xifactory.setProperty("http://java.sun.com/xml/stream/properties/report-cdata-event", true);
+        if (chunkSize > 0) {
+            xifactory.setProperty(CDATA_CHUNK_SIZE, chunkSize);
+        }
+        XMLStreamReader streamReader = xifactory.createXMLStreamReader(new StringReader(xml));
+
+        StringBuilder cdata = new StringBuilder();
+        int numOfChunks = 0;
+        boolean isWithinLimit = true;
+        while (streamReader.hasNext()) {
+            int eventType = streamReader.next();
+            switch (eventType) {
+                case XMLStreamConstants.START_ELEMENT:
+                    debugPrint("\nElement: " + streamReader.getLocalName());
+                    break;
+                case XMLStreamConstants.CDATA:
+                    String text = streamReader.getText();
+                    numOfChunks++;
+                    if (text.length() > chunkSize) {
+                        isWithinLimit = false;
+                    }
+                    debugPrint("\nCDATA: " + text.length());
+                    cdata.append(text);
+                    break;
+                case XMLStreamConstants.CHARACTERS:
+                    debugPrint("\nCharacters: " + streamReader.getText().length());
+                    break;
+            }
+        }
+        debugPrint("CData in single chunk:" + cdata.toString().length());
+        Assert.assertEquals(numOfChunks, expectedNumOfChunks);
+        Assert.assertEquals(isWithinLimit, withinLimit);
+    }
+
+    /*
+     * @bug 8158619
+     * Verifies StAX parser's support of the property
+     */
+    @Test(dataProvider = "xml-data")
+    public void testEventReader(String xml, int chunkSize, int expectedNumOfChunks, boolean withinLimit) throws Exception {
+        XMLInputFactory xif = XMLInputFactory.newInstance();
+        xif.setProperty("http://java.sun.com/xml/stream/properties/report-cdata-event", true);
+        if (chunkSize > 0) {
+            xif.setProperty(CDATA_CHUNK_SIZE, chunkSize);
+        }
+        XMLEventReader reader = xif.createXMLEventReader(new StringReader(xml));
+
+        StringBuilder cdata = new StringBuilder();
+        int numOfChunks = 0;
+        boolean isWithinLimit = true;
+        while (reader.hasNext()) {
+            XMLEvent event = reader.nextEvent();
+            //All text events get reported as Characters events
+            if (event.getEventType() == XMLStreamConstants.CHARACTERS) {
+                Characters cdataEvent = (Characters) event;
+                if (cdataEvent.isCData()) {
+                    String text = cdataEvent.getData();
+                    numOfChunks++;
+                    if (text.length() > chunkSize) {
+                        isWithinLimit = false;
+                    }
+                    debugPrint("\nCDATA: " + text.length());
+                    cdata.append(text);
+                }
+            }
+        }
+        debugPrint("CData in single chunk:" + cdata.toString().length());
+        Assert.assertEquals(numOfChunks, expectedNumOfChunks);
+        Assert.assertEquals(isWithinLimit, withinLimit);
+    }
+
+    /*
+     * Data for tests:
+     * xml, size limit, expected number of chunks, expected that the size of all chunks is within the limit
+     */
+    @DataProvider(name = "xml-data")
+    public Object[][] xmlData() throws Exception {
+        return new Object[][]{
+            //{xml, NO_LIMIT, 1, false},
+            {xml, 80, 13, true},};
+    }
+
+    final static String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
+            + "<tests><test><![CDATA[\n"
+            + "/**\n"
+            + " * The Catalog class represents an entity Catalog as defined by\n"
+            + " * <a\n"
+            + " * href=\"https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html\">\n"
+            + " * XML Catalogs, OASIS Standard V1.1, 7 October 2005</a>.\n"
+            + " * <p>\n"
+            + " * A catalog is an XML file that contains a root {@code catalog} entry with a list of catalog entries. The entries can also be grouped with a {@code group} entry. The catalog and group entries may specify {@code prefer} and {@code xml:base} attributes that set preference of public or system type of entries and base URI to resolve relative URIs.\n"
+            + "]]></test></tests>";
+
+    final static String xmlVal = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+            + "<Document xmlns=\"bug.report\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
+            + "    <Bug><![CDATA["
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
+            + ""
+            + "]]></Bug>\n"
+            + "</Document>\n"
+            + "";
+
+    final static String xsd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+            + "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"bug.report\" targetNamespace=\"bug.report\">\n"
+            + "    <xs:complexType name=\"T_Document\">\n"
+            + "        <xs:sequence>\n"
+            + "            <xs:element ref=\"Bug\"/>\n"
+            + "        </xs:sequence>\n"
+            + "    </xs:complexType>\n"
+            + "    <xs:element name=\"Document\" type=\"T_Document\"/>\n"
+            + "    <xs:element name=\"Bug\" type=\"Text\"/>\n"
+            + "    <xs:simpleType name=\"Text\">\n"
+            + "         <xs:restriction base=\"xs:string\">\n"
+            + "                 <xs:pattern value=\"[0-9A-Za-z ]*\"/>\n"
+            + //{1,8000}
+            "           </xs:restriction>\n"
+            + " </xs:simpleType>\n"
+            + "</xs:schema>\n"
+            + "";
+
+    /**
+     * SAX Handler
+     */
+    class MyHandler extends DefaultHandler2 {
+
+        StringBuilder text = new StringBuilder();
+        StringBuilder cdata = new StringBuilder();
+
+        int cdataChunkSize = 0;
+        boolean cdataStart = false;
+        boolean cdataEnd = false;
+        int numOfCDataChunks;
+        boolean withinLimit = true;
+
+        public MyHandler(int chunkSize) {
+            cdataChunkSize = chunkSize;
+        }
+
+        public String getText() {
+            return text.toString();
+        }
+
+        public String getCData() {
+            return cdata.toString();
+        }
+
+        public int getNumOfCDataChunks() {
+            return numOfCDataChunks;
+        }
+
+        public boolean chunkSizeWithinLimit() {
+            return withinLimit;
+        }
+
+        @Override
+        public void startCDATA() {
+            cdataStart = true;
+            debugPrint("\nstartCDATA");
+        }
+
+        public void endCDATA() {
+            cdataEnd = true;
+            debugPrint(cdata.toString());
+            debugPrint("\nendCDATA");
+        }
+
+        @Override
+        public void characters(char[] ch, int start, int length) throws SAXException {
+            if (cdataStart && !cdataEnd) {
+                numOfCDataChunks++;
+                cdata.append(ch, start, length);
+                if (length > cdataChunkSize) {
+                    withinLimit = false;
+                }
+            } else {
+                text.append(ch, start, length);
+            }
+
+            debugPrint("\ncharacter event\n" + new String(ch, start, length));
+        }
+    }
+
+    void debugPrint(String msg) {
+        if (DEBUG) {
+            System.out.println(msg);
+        }
+    }
+
+    static final boolean DEBUG = false;
+}
--- a/test/javax/xml/jaxp/unittest/transform/TransformerTest.java	Wed Nov 23 16:16:35 2016 +0000
+++ b/test/javax/xml/jaxp/unittest/transform/TransformerTest.java	Wed Nov 23 19:15:33 2016 +0000
@@ -27,17 +27,20 @@
 
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
 
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.sax.SAXSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
@@ -47,6 +50,7 @@
 import org.testng.annotations.Listeners;
 import org.testng.annotations.Test;
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.ContentHandler;
@@ -69,33 +73,10 @@
  * @run testng/othervm -DrunSecMngr=true transform.TransformerTest
  * @run testng/othervm transform.TransformerTest
  * @summary Transformer Tests
- * @bug 6272879 6305029 6505031 8150704 8162598
+ * @bug 6272879 6305029 6505031 8150704 8162598 8169772
  */
 @Listeners({jaxp.library.FilePolicy.class})
 public class TransformerTest {
-    private Transformer createTransformer() throws TransformerException {
-        return TransformerFactory.newInstance().newTransformer();
-    }
-
-    private Transformer createTransformerFromInputstream(InputStream xslStream) throws TransformerException {
-        return TransformerFactory.newInstance().newTransformer(new StreamSource(xslStream));
-    }
-
-    private Transformer createTransformerFromResource(String xslResource) throws TransformerException {
-        return TransformerFactory.newInstance().newTransformer(new StreamSource(getClass().getResource(xslResource).toString()));
-    }
-
-    private Document transformInputStreamToDocument(Transformer transformer, InputStream sourceStream) throws TransformerException {
-        DOMResult response = new DOMResult();
-        transformer.transform(new StreamSource(sourceStream), response);
-        return (Document)response.getNode();
-    }
-
-    private StringWriter transformResourceToStringWriter(Transformer transformer, String xmlResource) throws TransformerException {
-        StringWriter sw = new StringWriter();
-        transformer.transform(new StreamSource(getClass().getResource(xmlResource).toString()), new StreamResult(sw));
-        return sw;
-    }
 
     /**
      * Reads the contents of the given file into a string.
@@ -302,10 +283,15 @@
         System.out.println(sourceXml);
         System.out.println();
 
+        // transform to DOM result
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsl.getBytes())));
+        DOMResult result = new DOMResult();
+        t.transform(new StreamSource(new ByteArrayInputStream(sourceXml.getBytes())), result);
+        Document document = (Document)result.getNode();
+
         System.out.println("Result after transformation:");
         System.out.println("============================");
-        Document document = transformInputStreamToDocument(createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())),
-            new ByteArrayInputStream(sourceXml.getBytes()));
         OutputFormat format = new OutputFormat();
         format.setIndenting(true);
         new XMLSerializer(System.out, format).serialize(document);
@@ -335,13 +321,14 @@
         // test SAXSource
         SAXSource saxSource = new SAXSource(new XMLReaderFor6305029(), new InputSource());
         StringWriter resultWriter = new StringWriter();
-        createTransformer().transform(saxSource, new StreamResult(resultWriter));
+        TransformerFactory tf = TransformerFactory.newInstance();
+        tf.newTransformer().transform(saxSource, new StreamResult(resultWriter));
         AssertJUnit.assertEquals("Identity transform of SAXSource", XML_DOCUMENT, resultWriter.toString());
 
         // test StreamSource
         StreamSource streamSource = new StreamSource(new StringReader(XML_DOCUMENT));
         resultWriter = new StringWriter();
-        createTransformer().transform(streamSource, new StreamResult(resultWriter));
+        tf.newTransformer().transform(streamSource, new StreamResult(resultWriter));
         AssertJUnit.assertEquals("Identity transform of StreamSource", XML_DOCUMENT, resultWriter.toString());
     }
 
@@ -351,10 +338,13 @@
      */
     @Test
     public final void testBug6505031() throws TransformerException {
-        Transformer transformer = createTransformerFromResource("transform.xsl");
-        transformer.setParameter("config", getClass().getResource("config.xml").toString());
-        transformer.setParameter("mapsFile", getClass().getResource("maps.xml").toString());
-        String s = transformResourceToStringWriter(transformer, "template.xml").toString();
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = tf.newTransformer(new StreamSource(getClass().getResource("transform.xsl").toString()));
+        t.setParameter("config", getClass().getResource("config.xml").toString());
+        t.setParameter("mapsFile", getClass().getResource("maps.xml").toString());
+        StringWriter sw = new StringWriter();
+        t.transform(new StreamSource(getClass().getResource("template.xml").toString()), new StreamResult(sw));
+        String s = sw.toString();
         Assert.assertTrue(s.contains("map1key1value") && s.contains("map2key1value"));
     }
 
@@ -365,17 +355,20 @@
     @Test
     public final void testBug8150704() throws TransformerException, IOException {
         System.out.println("Testing transformation of Bug8150704-1.xml...");
-        Transformer transformer = createTransformerFromResource("Bug8150704-1.xsl");
-        StringWriter result = transformResourceToStringWriter(transformer, "Bug8150704-1.xml");
-        String resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = tf.newTransformer(new StreamSource(getClass().getResource("Bug8150704-1.xsl").toString()));
+        StringWriter sw = new StringWriter();
+        t.transform(new StreamSource(getClass().getResource("Bug8150704-1.xml").toString()), new StreamResult(sw));
+        String resultstring = sw.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
         String reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-1.ref").getPath()));
         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-1.xml does not match reference");
         System.out.println("Passed.");
 
         System.out.println("Testing transformation of Bug8150704-2.xml...");
-        transformer = createTransformerFromResource("Bug8150704-2.xsl");
-        result = transformResourceToStringWriter(transformer, "Bug8150704-2.xml");
-        resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
+        t = tf.newTransformer(new StreamSource(getClass().getResource("Bug8150704-2.xsl").toString()));
+        sw = new StringWriter();
+        t.transform(new StreamSource(getClass().getResource("Bug8150704-2.xml").toString()), new StreamResult(sw));
+        resultstring = sw.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
         reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-2.ref").getPath()));
         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-2.xml does not match reference");
         System.out.println("Passed.");
@@ -422,11 +415,15 @@
         System.out.println(sourceXml);
         System.out.println();
 
+        // transform to DOM result
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsl.getBytes())));
+        DOMResult result = new DOMResult();
+        t.transform(new StreamSource(new ByteArrayInputStream(sourceXml.getBytes())), result);
+        Document document = (Document)result.getNode();
+
         System.out.println("Result after transformation:");
         System.out.println("============================");
-        Document document = transformInputStreamToDocument(
-            createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())),
-                                             new ByteArrayInputStream(sourceXml.getBytes()));
         OutputFormat format = new OutputFormat();
         format.setIndenting(true);
         new XMLSerializer(System.out, format).serialize(document);
@@ -438,4 +435,38 @@
         checkNodeNS8162598(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
         Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(), "unexpected namespace for test6");
     }
+
+    /**
+     * @bug 8169772
+     * @summary Test transformation of DOM with null valued text node
+     *
+     * This test would throw a NullPointerException during transform when the
+     * fix was not present.
+     */
+    @Test
+    public final void testBug8169772() throws ParserConfigurationException,
+        SAXException, IOException, TransformerException
+    {
+        // create a small DOM
+        Document doc = DocumentBuilderFactory.newInstance().
+            newDocumentBuilder().parse(
+                new ByteArrayInputStream(
+                    "<?xml version=\"1.0\"?><DOCROOT/>".getBytes()
+                )
+            );
+
+        // insert a bad element
+        Element e = doc.createElement("ERROR");
+        e.appendChild(doc.createTextNode(null));
+        doc.getDocumentElement().appendChild(e);
+
+        // transform
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        TransformerFactory.newInstance().newTransformer().transform(
+            new DOMSource(doc.getDocumentElement()), new StreamResult(bos)
+        );
+        System.out.println("Transformation result (DOM with null text node):");
+        System.out.println("================================================");
+        System.out.println(bos);
+    }
 }