--- old/src/com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java 2014-06-04 13:55:58.219706817 -0700 +++ new/src/com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet.java 2014-06-04 13:55:58.131706289 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -32,7 +34,6 @@ import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.Enumeration; -import java.util.Vector; import javax.xml.transform.Templates; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; @@ -51,6 +52,7 @@ import com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory; import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +import com.sun.org.apache.xml.internal.serializer.ToStream; /** * @author Jacek Ambroziak @@ -74,7 +76,7 @@ public String _doctypeSystem = null; public boolean _indent = false; public String _mediaType = null; - public Vector _cdata = null; + public ArrayList _cdata = null; public int _indentamount = -1; public static final int FIRST_TRANSLET_VERSION = 100; @@ -642,7 +644,7 @@ */ public void addCdataElement(String name) { if (_cdata == null) { - _cdata = new Vector(); + _cdata = new ArrayList<>(); } int lastColon = name.lastIndexOf(':'); @@ -650,11 +652,11 @@ if (lastColon > 0) { String uri = name.substring(0, lastColon); String localName = name.substring(lastColon+1); - _cdata.addElement(uri); - _cdata.addElement(localName); + _cdata.add(uri); + _cdata.add(localName); } else { - _cdata.addElement(null); - _cdata.addElement(name); + _cdata.add(null); + _cdata.add(name); } } --- old/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java 2014-06-04 13:55:58.563708883 -0700 +++ new/src/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerImpl.java 2014-06-04 13:55:58.479708378 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -40,7 +42,7 @@ import java.util.Enumeration; import java.util.Properties; import java.util.StringTokenizer; -import java.util.Vector; +import java.util.ArrayList; import java.lang.reflect.Constructor; import javax.xml.parsers.DocumentBuilder; @@ -1084,7 +1086,7 @@ else if (name.equals(OutputKeys.CDATA_SECTION_ELEMENTS)) { if (value != null) { StringTokenizer e = new StringTokenizer(value); - Vector uriAndLocalNames = null; + ArrayList uriAndLocalNames = null; while (e.hasMoreTokens()) { final String token = e.nextToken(); @@ -1104,11 +1106,11 @@ } if (uriAndLocalNames == null) { - uriAndLocalNames = new Vector(); + uriAndLocalNames = new ArrayList<>(); } // add the uri/localName as a pair, in that order - uriAndLocalNames.addElement(uri); - uriAndLocalNames.addElement(localName); + uriAndLocalNames.add(uri); + uriAndLocalNames.add(localName); } handler.setCdataSectionElements(uriAndLocalNames); } --- old/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java 2014-06-04 13:55:58.951711212 -0700 +++ new/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java 2014-06-04 13:55:58.863710684 -0700 @@ -559,11 +559,13 @@ * @param token The token string */ private void addToken(String tokenStr) { - if (!fTokenNames.containsValue(tokenStr)) { - Integer tokenInt = new Integer(fTokenNames.size()); + String str = fTokenNames.get(tokenStr); + Integer tokenInt = str == null ? null : Integer.parseInt(str); + if (tokenInt == null) { + tokenInt = new Integer(fTokenNames.size()); fTokenNames.put(tokenInt, tokenStr); - addToken(tokenInt.intValue()); } + addToken(tokenInt.intValue()); } /** --- old/src/com/sun/org/apache/xerces/internal/xpointer/XPointerHandler.java 2014-06-04 13:55:59.291713232 -0700 +++ new/src/com/sun/org/apache/xerces/internal/xpointer/XPointerHandler.java 2014-06-04 13:55:59.207712734 -0700 @@ -524,11 +524,13 @@ * @param token The token string */ private void addToken(String tokenStr) { - if (!fTokenNames.containsValue(tokenStr)) { - Integer tokenInt = new Integer(fTokenNames.size()); + String str = fTokenNames.get(tokenStr); + Integer tokenInt = str == null ? null : Integer.parseInt(str); + if (tokenInt == null) { + tokenInt = new Integer(fTokenNames.size()); fTokenNames.put(tokenInt, tokenStr); - addToken(tokenInt.intValue()); } + addToken(tokenInt.intValue()); } /** @@ -1251,4 +1253,4 @@ super.setProperty(propertyId, value); } -} +} \ No newline at end of file --- old/src/com/sun/org/apache/xml/internal/serializer/EmptySerializer.java 2014-06-04 13:55:59.647715344 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/EmptySerializer.java 2014-06-04 13:55:59.559714822 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2003-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -27,7 +29,7 @@ import java.io.Writer; import java.util.Hashtable; import java.util.Properties; -import java.util.Vector; +import java.util.ArrayList; import javax.xml.transform.SourceLocator; import javax.xml.transform.Transformer; @@ -150,9 +152,9 @@ couldThrowIOException(); } /** - * @see SerializationHandler#setCdataSectionElements(java.util.Vector) + * @see SerializationHandler#setCdataSectionElements(java.util.ArrayList) */ - public void setCdataSectionElements(Vector URI_and_localNames) + public void setCdataSectionElements(ArrayList URI_and_localNames) { aMethodIsCalled(); } @@ -763,4 +765,25 @@ aMethodIsCalled(); } + + + public String getOutputProperty(String name) { + aMethodIsCalled(); + return null; + } + + public String getOutputPropertyDefault(String name) { + aMethodIsCalled(); + return null; + } + + public void setOutputProperty(String name, String val) { + aMethodIsCalled(); + + } + + public void setOutputPropertyDefault(String name, String val) { + aMethodIsCalled(); + + } } --- old/src/com/sun/org/apache/xml/internal/serializer/SerializerBase.java 2014-06-04 13:56:00.027717596 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/SerializerBase.java 2014-06-04 13:55:59.935717052 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -23,8 +25,11 @@ package com.sun.org.apache.xml.internal.serializer; import java.io.IOException; -import java.util.Vector; - +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; @@ -108,12 +113,12 @@ /** * The System ID for the doc type. */ - private String m_doctypeSystem; + protected String m_doctypeSystem; /** * The public ID for the doc type. */ - private String m_doctypePublic; + protected String m_doctypePublic; /** * Flag to tell that we need to add the doctype decl, which we can't do @@ -122,15 +127,9 @@ boolean m_needToOutputDocTypeDecl = true; /** - * The character encoding. Must match the encoding used for the - * printWriter. - */ - private String m_encoding = null; - - /** * Tells if we should write the XML declaration. */ - private boolean m_shouldNotWriteXMLHeader = false; + protected boolean m_shouldNotWriteXMLHeader = false; /** * The standalone value for the doctype. @@ -159,12 +158,12 @@ /** * Tells the XML version, for writing out to the XML decl. */ - private String m_version = null; + protected String m_version = null; /** * The mediatype. Not used right now. */ - private String m_mediatype; + protected String m_mediatype; /** * The transformer that was around when this output handler was created (if @@ -173,13 +172,6 @@ private Transformer m_transformer; /** - * Pairs of local names and corresponding URIs of CDATA sections. This list - * comes from the cdata-section-elements attribute. Every second one is a - * local name, and every other second one is the URI for the local name. - */ - protected Vector m_cdataSectionElements = null; - - /** * Namespace support, that keeps track of currently defined * prefix/uri mappings. As processed elements come and go, so do * the associated mappings for that element. @@ -538,16 +530,16 @@ */ public String getEncoding() { - return m_encoding; + return getOutputProperty(OutputKeys.ENCODING); } /** * Sets the character encoding coming from the xsl:output encoding stylesheet attribute. * @param m_encoding the character encoding */ - public void setEncoding(String m_encoding) + public void setEncoding(String encoding) { - this.m_encoding = m_encoding; + setOutputProperty(OutputKeys.ENCODING,encoding); } /** @@ -557,7 +549,8 @@ */ public void setOmitXMLDeclaration(boolean b) { - this.m_shouldNotWriteXMLHeader = b; + String val = b ? "yes":"no"; + setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,val); } @@ -588,7 +581,7 @@ */ public void setDoctypePublic(String doctypePublic) { - this.m_doctypePublic = doctypePublic; + setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctypePublic); } @@ -610,7 +603,7 @@ */ public void setDoctypeSystem(String doctypeSystem) { - this.m_doctypeSystem = doctypeSystem; + setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctypeSystem); } /** Set the value coming from the xsl:output doctype-public and doctype-system stylesheet properties @@ -621,8 +614,8 @@ */ public void setDoctype(String doctypeSystem, String doctypePublic) { - this.m_doctypeSystem = doctypeSystem; - this.m_doctypePublic = doctypePublic; + setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doctypeSystem); + setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, doctypePublic); } /** @@ -634,12 +627,9 @@ */ public void setStandalone(String standalone) { - if (standalone != null) - { - m_standaloneWasSpecified = true; - setStandaloneInternal(standalone); - } + setOutputProperty(OutputKeys.STANDALONE, standalone); } + /** * Sets the XSL standalone attribute, but does not remember if this is a * default or explicite setting. @@ -700,7 +690,7 @@ */ public void setVersion(String version) { - m_version = version; + setOutputProperty(OutputKeys.VERSION, version); } /** @@ -712,7 +702,7 @@ */ public void setMediaType(String mediaType) { - m_mediatype = mediaType; + setOutputProperty(OutputKeys.MEDIA_TYPE,mediaType); } /** @@ -741,7 +731,8 @@ */ public void setIndent(boolean doIndent) { - m_doIndent = doIndent; + String val = doIndent ? "yes":"no"; + setOutputProperty(OutputKeys.INDENT,val); } /** @@ -787,59 +778,6 @@ } /** - * Push a boolean state based on if the name of the current element - * is found in the list of qnames. A state is only pushed if - * there were some cdata-section-names were specified. - *

- * Hidden parameters are the vector of qualified elements specified in - * cdata-section-names attribute, and the m_cdataSectionStates stack - * onto which whether the current element is in the list is pushed (true or - * false). Other hidden parameters are the current elements namespaceURI, - * localName and qName - */ - protected boolean isCdataSection() - { - - boolean b = false; - - if (null != m_cdataSectionElements) - { - if (m_elemContext.m_elementLocalName == null) - m_elemContext.m_elementLocalName = - getLocalName(m_elemContext.m_elementName); - if (m_elemContext.m_elementURI == null) - { - String prefix = getPrefixPart(m_elemContext.m_elementName); - if (prefix != null) - m_elemContext.m_elementURI = - m_prefixMap.lookupNamespace(prefix); - - } - - if ((null != m_elemContext.m_elementURI) - && m_elemContext.m_elementURI.length() == 0) - m_elemContext.m_elementURI = null; - - int nElems = m_cdataSectionElements.size(); - - // loop through 2 at a time, as these are pairs of URI and localName - for (int i = 0; i < nElems; i += 2) - { - String uri = (String) m_cdataSectionElements.elementAt(i); - String loc = (String) m_cdataSectionElements.elementAt(i + 1); - if (loc.equals(m_elemContext.m_elementLocalName) - && subPartMatch(m_elemContext.m_elementURI, uri)) - { - b = true; - - break; - } - } - } - return b; - } - - /** * Tell if two strings are equal, without worry if the first string is null. * * @param p String reference, which may be null. @@ -1312,12 +1250,11 @@ private void resetSerializerBase() { this.m_attributes.clear(); - this.m_cdataSectionElements = null; + this.m_StringOfCDATASections = null; this.m_elemContext = new ElemContext(); this.m_doctypePublic = null; this.m_doctypeSystem = null; this.m_doIndent = false; - this.m_encoding = null; this.m_indentAmount = 0; this.m_inEntityRef = false; this.m_inExternalDTD = false; @@ -1398,5 +1335,334 @@ // This method just provides a definition to satisfy the interface // A particular sub-class of SerializerBase provides the implementation (if desired) } + + + /** + * The CDATA section names stored in a whitespace separateed list with + * each element being a word of the form "{uri}localName" This list + * comes from the cdata-section-elements attribute. + * + * This field replaces m_cdataSectionElements Vector. + */ + protected String m_StringOfCDATASections = null; + + boolean m_docIsEmpty = true; + void initCdataElems(String s) + { + if (s != null) + { + int max = s.length(); + + // true if we are in the middle of a pair of curly braces that delimit a URI + boolean inCurly = false; + + // true if we found a URI but haven't yet processed the local name + boolean foundURI = false; + + StringBuilder buf = new StringBuilder(); + String uri = null; + String localName = null; + + // parse through string, breaking on whitespaces. I do this instead + // of a tokenizer so I can track whitespace inside of curly brackets, + // which theoretically shouldn't happen if they contain legal URLs. + for (int i = 0; i < max; i++) + { + char c = s.charAt(i); + + if (Character.isWhitespace(c)) + { + if (!inCurly) + { + if (buf.length() > 0) + { + localName = buf.toString(); + if (!foundURI) + uri = ""; + addCDATAElement(uri,localName); + buf.setLength(0); + foundURI = false; + } + continue; + } + else + buf.append(c); // add whitespace to the URI + } + else if ('{' == c) // starting a URI + inCurly = true; + else if ('}' == c) + { + // we just ended a URI + foundURI = true; + uri = buf.toString(); + buf.setLength(0); + inCurly = false; + } + else + { + // append non-whitespace, non-curly to current URI or localName being gathered. + buf.append(c); + } + + } + + if (buf.length() > 0) + { + // We have one last localName to process. + localName = buf.toString(); + if (!foundURI) + uri = ""; + addCDATAElement(uri,localName); + } + } + } + + protected java.util.HashMap> m_CdataElems = null; + private void addCDATAElement(String uri, String localName) + { + if (m_CdataElems == null) { + m_CdataElems = new java.util.HashMap<>(); + } + + HashMap h = m_CdataElems.get(localName); + if (h == null) { + h = new HashMap<>(); + m_CdataElems.put(localName,h); + } + h.put(uri,uri); + + } + + + /** + * Return true if nothing has been sent to this result tree yet. + *

+ * This is not a public API. + * + * @xsl.usage internal + */ + public boolean documentIsEmpty() { + // If we haven't called startDocument() yet, then this document is empty + return m_docIsEmpty && (m_elemContext.m_currentElemDepth == 0); + } + + /** + * Return true if the current element in m_elemContext + * is a CDATA section. + * CDATA sections are specified in the attribute + * cdata-section-names or in the JAXP equivalent property. + * In any case the format of the value of such a property is: + *

+     * "{uri1}localName1 {uri2}localName2 . . . "
+     * 
+ * + *

+ * This method is not a public API, but is only used internally by the serializer. + */ + protected boolean isCdataSection() { + boolean b = false; + + if (null != m_StringOfCDATASections) { + if (m_elemContext.m_elementLocalName == null) { + String localName = getLocalName(m_elemContext.m_elementName); + m_elemContext.m_elementLocalName = localName; + } + + if ( m_elemContext.m_elementURI == null) { + + m_elemContext.m_elementURI = getElementURI(); + } + else if ( m_elemContext.m_elementURI.length() == 0) { + if ( m_elemContext.m_elementName == null) { + m_elemContext.m_elementName = m_elemContext.m_elementLocalName; + // leave URI as "", meaning in no namespace + } + else if (m_elemContext.m_elementLocalName.length() < m_elemContext.m_elementName.length()){ + // We were told the URI was "", yet the name has a prefix since the name is longer than the localname. + // So we will fix that incorrect information here. + m_elemContext.m_elementURI = getElementURI(); + } + } + + HashMap h = null; + if (m_CdataElems != null) { + h = m_CdataElems.get(m_elemContext.m_elementLocalName); + } + if (h != null) { + Object obj = h.get(m_elemContext.m_elementURI); + if (obj != null) + b = true; + } + + } + return b; + } + + /** + * Before this call m_elementContext.m_elementURI is null, + * which means it is not yet known. After this call it + * is non-null, but possibly "" meaning that it is in the + * default namespace. + * + * @return The URI of the element, never null, but possibly "". + */ + private String getElementURI() { + String uri = null; + // At this point in processing we have received all the + // namespace mappings + // As we still don't know the elements namespace, + // we now figure it out. + + String prefix = getPrefixPart(m_elemContext.m_elementName); + + if (prefix == null) { + // no prefix so lookup the URI of the default namespace + uri = m_prefixMap.lookupNamespace(""); + } else { + uri = m_prefixMap.lookupNamespace(prefix); + } + if (uri == null) { + // We didn't find the namespace for the + // prefix ... ouch, that shouldn't happen. + // This is a hack, we really don't know + // the namespace + uri = EMPTYSTRING; + } + + return uri; + } + + + /** + * Get the value of an output property, + * the explicit value, if any, otherwise the + * default value, if any, otherwise null. + */ + public String getOutputProperty(String name) { + String val = getOutputPropertyNonDefault(name); + // If no explicit value, try to get the default value + if (val == null) + val = getOutputPropertyDefault(name); + return val; + + } + /** + * Get the value of an output property, + * not the default value. If there is a default + * value, but no non-default value this method + * will return null. + *

+ * + */ + public String getOutputPropertyNonDefault(String name) { + return getProp(name,false); + } + + /** + * Get the default value of an xsl:output property, + * which would be null only if no default value exists + * for the property. + */ + public String getOutputPropertyDefault(String name) { + return getProp(name, true); + } + + /** + * Set the value for the output property, typically from + * an xsl:output element, but this does not change what + * the default value is. + */ + public void setOutputProperty(String name, String val) { + setProp(name,val,false); + } + + /** + * Set the default value for an output property, but this does + * not impact any explicitly set value. + */ + public void setOutputPropertyDefault(String name, String val) { + setProp(name,val,true); + + } + + /** + * A mapping of keys to explicitly set values, for example if + * and has an "encoding" attribute, this + * map will have what that attribute maps to. + */ + private HashMap m_OutputProps; + /** + * A mapping of keys to default values, for example if + * the default value of the encoding is "UTF-8" then this + * map will have that "encoding" maps to "UTF-8". + */ + private HashMap m_OutputPropsDefault; + + Set getOutputPropDefaultKeys() { + return m_OutputPropsDefault.keySet(); + } + Set getOutputPropKeys() { + return m_OutputProps.keySet(); + } + + private String getProp(String name, boolean defaultVal) { + if (m_OutputProps == null) { + m_OutputProps = new HashMap<>(); + m_OutputPropsDefault = new HashMap<>(); + } + + String val; + if (defaultVal) + val = m_OutputPropsDefault.get(name); + else + val = m_OutputProps.get(name); + + return val; + } + /** + * + * @param name The name of the property, e.g. "{http://myprop}indent-tabs" or "indent". + * @param val The value of the property, e.g. "4" + * @param defaultVal true if this is a default value being set for the property as + * opposed to a user define on, set say explicitly in the stylesheet or via JAXP + */ + void setProp(String name, String val, boolean defaultVal) { + if (m_OutputProps == null) { + m_OutputProps = new HashMap<>(); + m_OutputPropsDefault = new HashMap<>(); + } + + if (defaultVal) + m_OutputPropsDefault.put(name,val); + else { + if (OutputKeys.CDATA_SECTION_ELEMENTS.equals(name) && val != null) { + initCdataElems(val); + String oldVal = m_OutputProps.get(name); + String newVal; + if (oldVal == null) + newVal = oldVal + ' ' + val; + else + newVal = val; + m_OutputProps.put(name,newVal); + } + else { + m_OutputProps.put(name,val); + } + } + } + /** + * Get the first char of the local name + * @param name Either a local name, or a local name + * preceeded by a uri enclosed in curly braces. + */ + static char getFirstCharLocName(String name) { + final char first; + int i = name.indexOf('}'); + if (i < 0) + first = name.charAt(0); + else + first = name.charAt(i+1); + return first; + } } --- old/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java 2014-06-04 13:56:00.391719729 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java 2014-06-04 13:56:00.303719213 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -349,84 +351,84 @@ // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("A"); + elemDesc = (ElemDesc) m_elementFlags.get("a"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc.setAttr("NAME", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("AREA"); + elemDesc = (ElemDesc) m_elementFlags.get("area"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc.setAttr("NOHREF", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("BASE"); + elemDesc = (ElemDesc) m_elementFlags.get("base"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("BUTTON"); + elemDesc = (ElemDesc) m_elementFlags.get("button"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("BLOCKQUOTE"); + elemDesc = (ElemDesc) m_elementFlags.get("blockquote"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("DEL"); + elemDesc = (ElemDesc) m_elementFlags.get("del"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("DIR"); + elemDesc = (ElemDesc) m_elementFlags.get("dir"); elemDesc.setAttr("COMPACT", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("DIV"); + elemDesc = (ElemDesc) m_elementFlags.get("div"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); // Netscape 4 extension elemDesc.setAttr("NOWRAP", ElemDesc.ATTREMPTY); // Internet-Explorer extension // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("DL"); + elemDesc = (ElemDesc) m_elementFlags.get("dl"); elemDesc.setAttr("COMPACT", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("FORM"); + elemDesc = (ElemDesc) m_elementFlags.get("form"); elemDesc.setAttr("ACTION", ElemDesc.ATTRURL); // ---------------------------------------------- // Attribution to: "Voytenko, Dimitry" - elemDesc = (ElemDesc) m_elementFlags.get("FRAME"); + elemDesc = (ElemDesc) m_elementFlags.get("frame"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); elemDesc.setAttr("NORESIZE",ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("HEAD"); + elemDesc = (ElemDesc) m_elementFlags.get("head"); elemDesc.setAttr("PROFILE", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("HR"); + elemDesc = (ElemDesc) m_elementFlags.get("hr"); elemDesc.setAttr("NOSHADE", ElemDesc.ATTREMPTY); // ---------------------------------------------- // HTML 4.0, section 16.5 - elemDesc = (ElemDesc) m_elementFlags.get("IFRAME"); + elemDesc = (ElemDesc) m_elementFlags.get("iframe"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); // ---------------------------------------------- // Netscape 4 extension - elemDesc = (ElemDesc) m_elementFlags.get("ILAYER"); + elemDesc = (ElemDesc) m_elementFlags.get("ilayer"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("IMG"); + elemDesc = (ElemDesc) m_elementFlags.get("img"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); elemDesc.setAttr("USEMAP", ElemDesc.ATTRURL); elemDesc.setAttr("ISMAP", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("INPUT"); + elemDesc = (ElemDesc) m_elementFlags.get("input"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("USEMAP", ElemDesc.ATTRURL); elemDesc.setAttr("CHECKED", ElemDesc.ATTREMPTY); @@ -435,24 +437,24 @@ elemDesc.setAttr("READONLY", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("INS"); + elemDesc = (ElemDesc) m_elementFlags.get("ins"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); // ---------------------------------------------- // Netscape 4 extension - elemDesc = (ElemDesc) m_elementFlags.get("LAYER"); + elemDesc = (ElemDesc) m_elementFlags.get("layer"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("LINK"); + elemDesc = (ElemDesc) m_elementFlags.get("link"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("MENU"); + elemDesc = (ElemDesc) m_elementFlags.get("menu"); elemDesc.setAttr("COMPACT", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("OBJECT"); + elemDesc = (ElemDesc) m_elementFlags.get("object"); elemDesc.setAttr("CLASSID", ElemDesc.ATTRURL); elemDesc.setAttr("CODEBASE", ElemDesc.ATTRURL); elemDesc.setAttr("DATA", ElemDesc.ATTRURL); @@ -461,58 +463,58 @@ elemDesc.setAttr("DECLARE", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("OL"); + elemDesc = (ElemDesc) m_elementFlags.get("ol"); elemDesc.setAttr("COMPACT", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("OPTGROUP"); + elemDesc = (ElemDesc) m_elementFlags.get("optgroup"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("OPTION"); + elemDesc = (ElemDesc) m_elementFlags.get("option"); elemDesc.setAttr("SELECTED", ElemDesc.ATTREMPTY); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("Q"); + elemDesc = (ElemDesc) m_elementFlags.get("q"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("SCRIPT"); + elemDesc = (ElemDesc) m_elementFlags.get("script"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("FOR", ElemDesc.ATTRURL); elemDesc.setAttr("DEFER", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("SELECT"); + elemDesc = (ElemDesc) m_elementFlags.get("select"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc.setAttr("MULTIPLE", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("TABLE"); + elemDesc = (ElemDesc) m_elementFlags.get("table"); elemDesc.setAttr("NOWRAP", ElemDesc.ATTREMPTY); // Internet-Explorer extension // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("TD"); + elemDesc = (ElemDesc) m_elementFlags.get("td"); elemDesc.setAttr("NOWRAP", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("TEXTAREA"); + elemDesc = (ElemDesc) m_elementFlags.get("textarea"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc.setAttr("READONLY", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("TH"); + elemDesc = (ElemDesc) m_elementFlags.get("th"); elemDesc.setAttr("NOWRAP", ElemDesc.ATTREMPTY); // ---------------------------------------------- // The nowrap attribute of a tr element is both // a Netscape and Internet-Explorer extension - elemDesc = (ElemDesc) m_elementFlags.get("TR"); + elemDesc = (ElemDesc) m_elementFlags.get("tr"); elemDesc.setAttr("NOWRAP", ElemDesc.ATTREMPTY); // ---------------------------------------------- - elemDesc = (ElemDesc) m_elementFlags.get("UL"); + elemDesc = (ElemDesc) m_elementFlags.get("ul"); elemDesc.setAttr("COMPACT", ElemDesc.ATTREMPTY); } @@ -1762,7 +1764,7 @@ * lets determine if the current element is specified in the cdata- * section-elements list. */ - if (m_cdataSectionElements != null) + if (m_StringOfCDATASections != null) m_elemContext.m_isCdataSection = isCdataSection(); if (m_doIndent) { @@ -1776,54 +1778,7 @@ throw new SAXException(e); } } - /** - * Initialize the serializer with the specified output stream and output - * format. Must be called before calling any of the serialize methods. - * - * @param output The output stream to use - * @param format The output format - * @throws UnsupportedEncodingException The encoding specified in the - * output format is not supported - */ - protected synchronized void init(OutputStream output, Properties format) - throws UnsupportedEncodingException - { - if (null == format) - { - format = OutputPropertiesFactory.getDefaultMethodProperties(Method.HTML); - } - super.init(output,format, false); - } - - /** - * Specifies an output stream to which the document should be - * serialized. This method should not be called while the - * serializer is in the process of serializing a document. - *

- * The encoding specified in the output properties is used, or - * if no encoding was specified, the default for the selected - * output method. - * - * @param output The output stream - */ - public void setOutputStream(OutputStream output) - { - try - { - Properties format; - if (null == m_format) - format = OutputPropertiesFactory.getDefaultMethodProperties(Method.HTML); - else - format = m_format; - init(output, format, true); - } - catch (UnsupportedEncodingException uee) - { - - // Should have been warned in init, I guess... - } - } /** * This method is used when a prefix/uri namespace mapping * is indicated after the element was started with a --- old/src/com/sun/org/apache/xml/internal/serializer/ToSAXHandler.java 2014-06-04 13:56:00.759721885 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/ToSAXHandler.java 2014-06-04 13:56:00.675721393 -0700 @@ -22,7 +22,7 @@ */ package com.sun.org.apache.xml.internal.serializer; -import java.util.Vector; +import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -234,9 +234,9 @@ /** * Does nothing. The setting of CDATA section elements has an impact on * stream serializers. - * @see SerializationHandler#setCdataSectionElements(java.util.Vector) + * @see SerializationHandler#setCdataSectionElements(java.util.ArrayList) */ - public void setCdataSectionElements(Vector URI_and_localNames) + public void setCdataSectionElements(ArrayList URI_and_localNames) { // do nothing } --- old/src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2014-06-04 13:56:01.115723963 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/ToStream.java 2014-06-04 13:56:01.019723407 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -25,11 +27,15 @@ import com.sun.org.apache.xalan.internal.utils.SecuritySupport; import java.io.IOException; import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.util.Enumeration; +import java.util.Iterator; import java.util.Properties; +import java.util.Set; import java.util.StringTokenizer; -import java.util.Vector; +import java.util.ArrayList; import javax.xml.transform.ErrorListener; import javax.xml.transform.OutputKeys; @@ -186,9 +192,6 @@ */ boolean m_isUTF8 = false; - /** The xsl:output properties. */ - protected Properties m_format; - /** * remembers if we are in between the startCDATA() and endCDATA() callbacks */ @@ -306,6 +309,7 @@ } } + OutputStream m_outputStream; /** * Get the output stream where the events will be serialized to. * @@ -314,13 +318,7 @@ */ public OutputStream getOutputStream() { - - if (m_writer instanceof WriterToUTF8Buffered) - return ((WriterToUTF8Buffered) m_writer).getOutputStream(); - if (m_writer instanceof WriterToASCI) - return ((WriterToASCI) m_writer).getOutputStream(); - else - return null; + return m_outputStream; } // Implement DeclHandler @@ -419,10 +417,174 @@ */ protected final void outputLineSep() throws IOException { - m_writer.write(m_lineSep, 0, m_lineSepLen); } + void setProp(String name, String val, boolean defaultVal) { + if (val != null) { + + char first = getFirstCharLocName(name); + switch (first) { + case 'c': + if (OutputKeys.CDATA_SECTION_ELEMENTS.equals(name)) { + addCdataSectionElements(val); // val is cdataSectionNames + } + break; + case 'd': + if (OutputKeys.DOCTYPE_SYSTEM.equals(name)) { + this.m_doctypeSystem = val; + } else if (OutputKeys.DOCTYPE_PUBLIC.equals(name)) { + this.m_doctypePublic = val; + if (val.startsWith("-//W3C//DTD XHTML")) + m_spaceBeforeClose = true; + } + break; + case 'e': + String newEncoding = val; + if (OutputKeys.ENCODING.equals(name)) { + String possible_encoding = Encodings.getMimeEncoding(val); + if (possible_encoding != null) { + // if the encoding is being set, try to get the + // preferred + // mime-name and set it too. + super.setProp("mime-name", possible_encoding, + defaultVal); + } + final String oldExplicitEncoding = getOutputPropertyNonDefault(OutputKeys.ENCODING); + final String oldDefaultEncoding = getOutputPropertyDefault(OutputKeys.ENCODING); + if ( (defaultVal && ( oldDefaultEncoding == null || !oldDefaultEncoding.equalsIgnoreCase(newEncoding))) + || ( !defaultVal && (oldExplicitEncoding == null || !oldExplicitEncoding.equalsIgnoreCase(newEncoding) ))) { + // We are trying to change the default or the non-default setting of the encoding to a different value + // from what it was + + EncodingInfo encodingInfo = Encodings.getEncodingInfo(newEncoding); + if (newEncoding != null && encodingInfo.name == null) { + // We tried to get an EncodingInfo for Object for the given + // encoding, but it came back with an internall null name + // so the encoding is not supported by the JDK, issue a message. + final String msg = Utils.messages.createMessage( + MsgKey.ER_ENCODING_NOT_SUPPORTED,new Object[]{ newEncoding }); + + final String msg2 = + "Warning: encoding \"" + newEncoding + "\" not supported, using " + + Encodings.DEFAULT_MIME_ENCODING; + try { + // Prepare to issue the warning message + final Transformer tran = super.getTransformer(); + if (tran != null) { + final ErrorListener errHandler = tran + .getErrorListener(); + // Issue the warning message + if (null != errHandler + && m_sourceLocator != null) { + errHandler + .warning(new TransformerException( + msg, m_sourceLocator)); + errHandler + .warning(new TransformerException( + msg2, m_sourceLocator)); + } else { + System.out.println(msg); + System.out.println(msg2); + } + } else { + System.out.println(msg); + System.out.println(msg2); + } + } catch (Exception e) { + } + + // We said we are using UTF-8, so use it + newEncoding = Encodings.DEFAULT_MIME_ENCODING; + val = Encodings.DEFAULT_MIME_ENCODING; // to store the modified value into the properties a little later + encodingInfo = Encodings.getEncodingInfo(newEncoding); + } + // The encoding was good, or was forced to UTF-8 above + + + // If there is already a non-default set encoding and we + // are trying to set the default encoding, skip the this block + // as the non-default value is already the one to use. + if (defaultVal == false || oldExplicitEncoding == null) { + m_encodingInfo = encodingInfo; + if (newEncoding != null) + m_isUTF8 = newEncoding.equals(Encodings.DEFAULT_MIME_ENCODING); + + // if there was a previously set OutputStream + OutputStream os = getOutputStream(); + if (os != null) { + Writer w = getWriter(); + + // If the writer was previously set, but + // set by the user, or if the new encoding is the same + // as the old encoding, skip this block + String oldEncoding = getOutputProperty(OutputKeys.ENCODING); + if ((w == null || !m_writer_set_by_user) + && !newEncoding.equalsIgnoreCase(oldEncoding)) { + // Make the change of encoding in our internal + // table, then call setOutputStreamInternal + // which will stomp on the old Writer (if any) + // with a new Writer with the new encoding. + super.setProp(name, val, defaultVal); + setOutputStreamInternal(os,false); + } + } + } + } + } + break; + case 'i': + if (OutputPropertiesFactory.S_KEY_INDENT_AMOUNT.equals(name)) { + setIndentAmount(Integer.parseInt(val)); + } else if (OutputKeys.INDENT.equals(name)) { + boolean b = "yes".equals(val) ? true : false; + m_doIndent = b; + } + + break; + case 'l': + if (OutputPropertiesFactory.S_KEY_LINE_SEPARATOR.equals(name)) { + m_lineSep = val.toCharArray(); + m_lineSepLen = m_lineSep.length; + } + + break; + case 'm': + if (OutputKeys.MEDIA_TYPE.equals(name)) { + m_mediatype = val; + } + break; + case 'o': + if (OutputKeys.OMIT_XML_DECLARATION.equals(name)) { + boolean b = "yes".equals(val) ? true : false; + this.m_shouldNotWriteXMLHeader = b; + } + break; + case 's': + // if standalone was explicitly specified + if (OutputKeys.STANDALONE.equals(name)) { + if (defaultVal) { + setStandaloneInternal(val); + } else { + m_standaloneWasSpecified = true; + setStandaloneInternal(val); + } + } + + break; + case 'v': + if (OutputKeys.VERSION.equals(name)) { + m_version = val; + } + break; + default: + break; + + } + super.setProp(name, val, defaultVal); + } + } + /** * Specifies an output format for this serializer. It the * serializer has already been associated with an output format, @@ -434,116 +596,35 @@ */ public void setOutputFormat(Properties format) { - boolean shouldFlush = m_shouldFlush; - - init(m_writer, format, false, false); - - m_shouldFlush = shouldFlush; - } - - /** - * Initialize the serializer with the specified writer and output format. - * Must be called before calling any of the serialize methods. - * This method can be called multiple times and the xsl:output properties - * passed in the 'format' parameter are accumulated across calls. - * - * @param writer The writer to use - * @param format The output format - * @param shouldFlush True if the writer should be flushed at EndDocument. - */ - private synchronized void init( - Writer writer, - Properties format, - boolean defaultProperties, - boolean shouldFlush) - { - - m_shouldFlush = shouldFlush; - - - // if we are tracing events we need to trace what - // characters are written to the output writer. - if (m_tracer != null - && !(writer instanceof SerializerTraceWriter) ) - m_writer = new SerializerTraceWriter(writer, m_tracer); - else - m_writer = writer; - - - m_format = format; - // m_cdataSectionNames = - // OutputProperties.getQNameProperties( - // OutputKeys.CDATA_SECTION_ELEMENTS, - // format); - setCdataSectionElements(OutputKeys.CDATA_SECTION_ELEMENTS, format); - - setIndentAmount( - OutputPropertyUtils.getIntProperty( - OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, - format)); - setIndent( - OutputPropertyUtils.getBooleanProperty(OutputKeys.INDENT, format)); - - { - String sep = - format.getProperty(OutputPropertiesFactory.S_KEY_LINE_SEPARATOR); - if (sep != null) { - m_lineSep = sep.toCharArray(); - m_lineSepLen = sep.length(); - } - } - - boolean shouldNotWriteXMLHeader = - OutputPropertyUtils.getBooleanProperty( - OutputKeys.OMIT_XML_DECLARATION, - format); - setOmitXMLDeclaration(shouldNotWriteXMLHeader); - setDoctypeSystem(format.getProperty(OutputKeys.DOCTYPE_SYSTEM)); - String doctypePublic = format.getProperty(OutputKeys.DOCTYPE_PUBLIC); - setDoctypePublic(doctypePublic); - - // if standalone was explicitly specified - if (format.get(OutputKeys.STANDALONE) != null) - { - String val = format.getProperty(OutputKeys.STANDALONE); - if (defaultProperties) - setStandaloneInternal(val); - else - setStandalone(val); - } - - setMediaType(format.getProperty(OutputKeys.MEDIA_TYPE)); - - if (null != doctypePublic) - { - if (doctypePublic.startsWith("-//W3C//DTD XHTML")) - m_spaceBeforeClose = true; - } - - /* - * This code is added for XML 1.1 Version output. - */ - String version = getVersion(); - if (null == version) + + if (format != null) { - version = format.getProperty(OutputKeys.VERSION); - setVersion(version); - } - - // initCharsMap(); - String encoding = getEncoding(); - if (null == encoding) - { - encoding = - Encodings.getMimeEncoding( - format.getProperty(OutputKeys.ENCODING)); - setEncoding(encoding); - } - - m_isUTF8 = encoding.equals(Encodings.DEFAULT_MIME_ENCODING); + // 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()) + { + String key = (String) propNames.nextElement(); + // Get the value, possibly a default value + String value = format.getProperty(key); + // Get the non-default value (if any). + String explicitValue = (String) format.get(key); + if (explicitValue == null && value != null) { + // This is a default value + this.setOutputPropertyDefault(key,value); + } + if (explicitValue != null) { + // This is an explicit non-default value + this.setOutputProperty(key,explicitValue); + } + } + } - // Access this only from the Hashtable level... we don't want to + // Access this only from the Hashtable level... we don't want to // get default properties. String entitiesFileName = (String) format.get(OutputPropertiesFactory.S_KEY_ENTITIES); @@ -551,125 +632,45 @@ if (null != entitiesFileName) { - String method = + String method = (String) format.get(OutputKeys.METHOD); - + m_charInfo = CharInfo.getCharInfo(entitiesFileName, method); } - } - /** - * Initialize the serializer with the specified writer and output format. - * Must be called before calling any of the serialize methods. - * - * @param writer The writer to use - * @param format The output format - */ - private synchronized void init(Writer writer, Properties format) - { - init(writer, format, false, false); + + + m_shouldFlush = shouldFlush; } + /** - * Initialize the serializer with the specified output stream and output - * format. Must be called before calling any of the serialize methods. - * - * @param output The output stream to use - * @param format The output format - * @param defaultProperties true if the properties are the default - * properties + * Returns the output format for this serializer. * - * @throws UnsupportedEncodingException The encoding specified in the - * output format is not supported + * @return The output format in use */ - protected synchronized void init( - OutputStream output, - Properties format, - boolean defaultProperties) - throws UnsupportedEncodingException - { - - String encoding = getEncoding(); - if (encoding == null) - { - // if not already set then get it from the properties - encoding = - Encodings.getMimeEncoding( - format.getProperty(OutputKeys.ENCODING)); - setEncoding(encoding); - } - - if (encoding.equalsIgnoreCase("UTF-8")) - { - m_isUTF8 = true; - // if (output instanceof java.io.BufferedOutputStream) - // { - // init(new WriterToUTF8(output), format, defaultProperties, true); - // } - // else if (output instanceof java.io.FileOutputStream) - // { - // init(new WriterToUTF8Buffered(output), format, defaultProperties, true); - // } - // else - // { - // // Not sure what to do in this case. I'm going to be conservative - // // and not buffer. - // init(new WriterToUTF8(output), format, defaultProperties, true); - // } - - - init( - new WriterToUTF8Buffered(output), - format, - defaultProperties, - true); - - - } - else if ( - encoding.equals("WINDOWS-1250") - || encoding.equals("US-ASCII") - || encoding.equals("ASCII")) + public Properties getOutputFormat() { + Properties def = new Properties(); { - init(new WriterToASCI(output), format, defaultProperties, true); + Set s = getOutputPropDefaultKeys(); + for (String key : s) { + String val = getOutputPropertyDefault(key); + def.put(key, val); + } } - else + + Properties props = new Properties(def); { - Writer osw; - - try - { - osw = Encodings.getWriter(output, encoding); - } - catch (UnsupportedEncodingException uee) - { - System.out.println( - "Warning: encoding \"" - + encoding - + "\" not supported" - + ", using " - + Encodings.DEFAULT_MIME_ENCODING); - - encoding = Encodings.DEFAULT_MIME_ENCODING; - setEncoding(encoding); - osw = Encodings.getWriter(output, encoding); + Set s = getOutputPropKeys(); + for (String key : s) { + String val = getOutputPropertyNonDefault(key); + if (val != null) + props.put(key, val); } - - init(osw, format, defaultProperties, true); } - + return props; } - - /** - * Returns the output format for this serializer. - * - * @return The output format in use - */ - public Properties getOutputFormat() - { - return m_format; - } - + /** * Specifies a writer to which the document should be serialized. * This method should not be called while the serializer is in @@ -679,13 +680,28 @@ */ public void setWriter(Writer writer) { + setWriterInternal(writer, true); + } + + private boolean m_writer_set_by_user; + private void setWriterInternal(Writer writer, boolean setByUser) { + m_writer_set_by_user = setByUser; + m_writer = writer; // if we are tracing events we need to trace what // characters are written to the output writer. - if (m_tracer != null - && !(writer instanceof SerializerTraceWriter) ) - m_writer = new SerializerTraceWriter(writer, m_tracer); - else - m_writer = writer; + if (m_tracer != null) { + boolean noTracerYet = true; + Writer w2 = m_writer; + while (w2 instanceof WriterChain) { + if (w2 instanceof SerializerTraceWriter) { + noTracerYet = false; + break; + } + w2 = ((WriterChain)w2).getWriter(); + } + if (noTracerYet) + m_writer = new SerializerTraceWriter(m_writer, m_tracer); + } } /** @@ -720,25 +736,68 @@ */ public void setOutputStream(OutputStream output) { + setOutputStreamInternal(output, true); + } + + private void setOutputStreamInternal(OutputStream output, boolean setByUser) + { + m_outputStream = output; + String encoding = getOutputProperty(OutputKeys.ENCODING); + if (Encodings.DEFAULT_MIME_ENCODING.equalsIgnoreCase(encoding)) + { + // We wrap the OutputStream with a writer, but + // not one set by the user + try { + setWriterInternal(new WriterToUTF8Buffered(output), false); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } else if ( + "WINDOWS-1250".equals(encoding) + || "US-ASCII".equals(encoding) + || "ASCII".equals(encoding)) + { + setWriterInternal(new WriterToASCI(output), false); + } else if (encoding != null) { + Writer osw = null; + try + { + osw = Encodings.getWriter(output, encoding); + } + catch (UnsupportedEncodingException uee) + { + osw = null; + } - try - { - Properties format; - if (null == m_format) - format = - OutputPropertiesFactory.getDefaultMethodProperties( - Method.XML); - else - format = m_format; - init(output, format, true); - } - catch (UnsupportedEncodingException uee) - { + + if (osw == null) { + System.out.println( + "Warning: encoding \"" + + encoding + + "\" not supported" + + ", using " + + Encodings.DEFAULT_MIME_ENCODING); - // Should have been warned in init, I guess... + encoding = Encodings.DEFAULT_MIME_ENCODING; + setEncoding(encoding); + try { + osw = Encodings.getWriter(output, encoding); + } catch (UnsupportedEncodingException e) { + // We can't really get here, UTF-8 is always supported + // This try-catch exists to make the compiler happy + e.printStackTrace(); + } + } + setWriterInternal(osw,false); + } + else { + // don't have any encoding, but we have an OutputStream + Writer osw = new OutputStreamWriter(output); + setWriterInternal(osw,false); } } + /** * @see SerializationHandler#setEscaping(boolean) */ @@ -2455,9 +2514,9 @@ * lets determine if the current element is specified in the cdata- * section-elements list. */ - if (m_cdataSectionElements != null) + if (m_StringOfCDATASections != null) m_elemContext.m_isCdataSection = isCdataSection(); - + if (m_doIndent) { m_isprevtext = false; @@ -2532,12 +2591,12 @@ * @param key the property key. * @param props the list of properties to search in. * - * Sets the vector of local-name/URI pairs of the cdata section elements + * Sets the ArrayList of local-name/URI pairs of the cdata section elements * specified in the cdata-section-elements property. * * This method is essentially a copy of getQNameProperties() from * OutputProperties. Eventually this method should go away and a call - * to setCdataSectionElements(Vector v) should be made directly. + * to setCdataSectionElements(ArrayList v) should be made directly. */ private void setCdataSectionElements(String key, Properties props) { @@ -2546,11 +2605,11 @@ if (null != s) { - // Vector of URI/LocalName pairs - Vector v = new Vector(); + // ArrayList of URI/LocalName pairs + ArrayList v = new ArrayList<>(); int l = s.length(); boolean inCurly = false; - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); // parse through string, breaking on whitespaces. I do this instead // of a tokenizer so I can track whitespace inside of curly brackets, @@ -2597,7 +2656,7 @@ * * @return a QName object */ - private void addCdataSectionElement(String URI_and_localName, Vector v) + private void addCdataSectionElement(String URI_and_localName, ArrayList v) { StringTokenizer tokenizer = @@ -2608,29 +2667,56 @@ if (null == s2) { // add null URI and the local name - v.addElement(null); - v.addElement(s1); + v.add(null); + v.add(s1); } else { // add URI, then local name - v.addElement(s1); - v.addElement(s2); + v.add(s1); + v.add(s2); } } /** * Remembers the cdata sections specified in the cdata-section-elements. - * The "official way to set URI and localName pairs. + * The "official way to set URI and localName pairs. * This method should be used by both Xalan and XSLTC. - * - * @param URI_and_localNames a vector of pairs of Strings (URI/local) + * + * @param URI_and_localNames an ArrayList of pairs of Strings (URI/local) */ - public void setCdataSectionElements(Vector URI_and_localNames) + public void setCdataSectionElements(ArrayList URI_and_localNames) { - m_cdataSectionElements = URI_and_localNames; + // convert to the new way. + if (URI_and_localNames != null) + { + final int len = URI_and_localNames.size() - 1; + if (len > 0) + { + final StringBuilder sb = new StringBuilder(); + 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 there is no URI don't put this in, just the localName then. + sb.append('{'); + sb.append(uri); + sb.append('}'); + } + sb.append(localName); + } + m_StringOfCDATASections = sb.toString(); + } + } + initCdataElems(m_StringOfCDATASections); } - + /** * Makes sure that the namespace URI for the given qualified attribute name * is declared. @@ -3084,37 +3170,7 @@ */ public void setEncoding(String encoding) { - String old = getEncoding(); - super.setEncoding(encoding); - if (old == null || !old.equals(encoding)) { - // If we have changed the setting of the - m_encodingInfo = Encodings.getEncodingInfo(encoding); - - if (encoding != null && m_encodingInfo.name == null) { - // We tried to get an EncodingInfo for Object for the given - // encoding, but it came back with an internall null name - // so the encoding is not supported by the JDK, issue a message. - String msg = Utils.messages.createMessage( - MsgKey.ER_ENCODING_NOT_SUPPORTED,new Object[]{ encoding }); - try - { - // Prepare to issue the warning message - Transformer tran = super.getTransformer(); - if (tran != null) { - ErrorListener errHandler = tran.getErrorListener(); - // Issue the warning message - if (null != errHandler && m_sourceLocator != null) - errHandler.warning(new TransformerException(msg, m_sourceLocator)); - else - System.out.println(msg); - } - else - System.out.println(msg); - } - catch (Exception e){} - } - } - return; + setOutputProperty(OutputKeys.ENCODING,encoding); } /** @@ -3386,4 +3442,24 @@ public void setDTDEntityExpansion(boolean expand) { m_expandDTDEntities = expand; } + + /** + * Remembers the cdata sections specified in the cdata-section-elements by appending the given + * cdata section elements to the list. This method can be called multiple times, but once an + * element is put in the list of cdata section elements it can not be removed. + * This method should be used by both Xalan and XSLTC. + * + * @param URI_and_localNames a whitespace separated list of element names, each element + * is a URI in curly braces (optional) and a local name. An example of such a parameter is: + * "{http://company.com}price {myURI2}book chapter" + */ + public void addCdataSectionElements(String URI_and_localNames) + { + if (URI_and_localNames != null) + initCdataElems(URI_and_localNames); + if (m_StringOfCDATASections == null) + m_StringOfCDATASections = URI_and_localNames; + else + m_StringOfCDATASections += (" " + URI_and_localNames); + } } --- old/src/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java 2014-06-04 13:56:01.535726393 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/ToUnknownStream.java 2014-06-04 13:56:01.447725884 -0700 @@ -26,7 +26,7 @@ import java.io.OutputStream; import java.io.Writer; import java.util.Properties; -import java.util.Vector; +import java.util.ArrayList; import javax.xml.transform.SourceLocator; import javax.xml.transform.Transformer; @@ -100,12 +100,12 @@ * A collection of namespace URI's (only for first element). * _namespacePrefix has the matching prefix for these URI's */ - private Vector m_namespaceURI = null; + private ArrayList m_namespaceURI = null; /** * A collection of namespace Prefix (only for first element) * _namespaceURI has the matching URIs for these prefix' */ - private Vector m_namespacePrefix = null; + private ArrayList m_namespacePrefix = null; /** * true if startDocument() was called before the underlying handler @@ -421,11 +421,11 @@ { if (m_namespacePrefix == null) { - m_namespacePrefix = new Vector(); - m_namespaceURI = new Vector(); + m_namespacePrefix = new ArrayList<>(); + m_namespaceURI = new ArrayList<>(); } - m_namespacePrefix.addElement(prefix); - m_namespaceURI.addElement(uri); + m_namespacePrefix.add(prefix); + m_namespaceURI.add(uri); if (m_firstElementURI == null) { @@ -1092,8 +1092,8 @@ for (int i = 0; i < n; i++) { final String prefix = - (String) m_namespacePrefix.elementAt(i); - final String uri = (String) m_namespaceURI.elementAt(i); + (String) m_namespacePrefix.get(i); + final String uri = (String) m_namespaceURI.get(i); m_handler.startPrefixMapping(prefix, uri, false); } m_namespacePrefix = null; @@ -1165,8 +1165,8 @@ final int max = m_namespacePrefix.size(); for (int i = 0; i < max; i++) { - final String prefix = (String) m_namespacePrefix.elementAt(i); - final String uri = (String) m_namespaceURI.elementAt(i); + final String prefix = m_namespacePrefix.get(i); + final String uri = m_namespaceURI.get(i); if (m_firstElementPrefix != null && m_firstElementPrefix.equals(prefix) @@ -1194,7 +1194,7 @@ * specified in the cdata-section-elements attribute. * @see SerializationHandler#setCdataSectionElements(java.util.Vector) */ - public void setCdataSectionElements(Vector URI_and_localNames) + public void setCdataSectionElements(ArrayList URI_and_localNames) { m_handler.setCdataSectionElements(URI_and_localNames); } --- old/src/com/sun/org/apache/xml/internal/serializer/WriterToUTF8Buffered.java 2014-06-04 13:56:01.879728384 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/WriterToUTF8Buffered.java 2014-06-04 13:56:01.795727898 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * --- old/src/com/sun/org/apache/xml/internal/serializer/XSLOutputAttributes.java 2014-06-04 13:56:02.235730428 -0700 +++ new/src/com/sun/org/apache/xml/internal/serializer/XSLOutputAttributes.java 2014-06-04 13:56:02.143729902 -0700 @@ -3,9 +3,11 @@ * DO NOT REMOVE OR ALTER! */ /* - * Copyright 2003-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); + * 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 * @@ -22,7 +24,7 @@ */ package com.sun.org.apache.xml.internal.serializer; -import java.util.Vector; +import java.util.ArrayList; /** * This interface has methods associated with the XSLT xsl:output attribues @@ -105,11 +107,6 @@ */ public String getVersion(); - - - - - /** * Sets the value coming from the xsl:output cdata-section-elements * stylesheet property. @@ -124,8 +121,8 @@ * relevant in specifying which elements have their text to be output as * CDATA sections. */ - public void setCdataSectionElements(Vector URI_and_localNames); - + public void setCdataSectionElements(ArrayList URI_and_localNames); + /** Set the value coming from the xsl:output doctype-public and doctype-system stylesheet properties * @param system the system identifier to be used in the DOCTYPE declaration * in the output document. @@ -181,4 +178,58 @@ */ public void setVersion(String version); + /** + * Get the value for a property that affects seraialization, + * if a property was set return that value, otherwise return + * the default value, otherwise return null. + * @param name The name of the property, which is just the local name + * if it is in no namespace, but is the URI in curly braces followed by + * the local name if it is in a namespace, for example: + *

    + *
  • "encoding" + *
  • "method" + *
  • "{http://xml.apache.org/xalan}indent-amount" + *
  • "{http://xml.apache.org/xalan}line-separator" + *
+ * @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 + * was set for the property, however the value returned by this method + * is unaffected by any non-default settings. + * @param name The name of the property. + * @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 + * if it is in no namespace, but is the URI in curly braces followed by + * the local name if it is in a namespace, for example: + *
    + *
  • "encoding" + *
  • "method" + *
  • "{http://xml.apache.org/xalan}indent-amount" + *
  • "{http://xml.apache.org/xalan}line-separator" + *
+ * @val The non-default value of the parameter + */ + public void setOutputProperty(String name, String val); + + /** + * Set the default value for a property that affects seraialization. + * @param name The name of the property, which is just the local name + * if it is in no namespace, but is the URI in curly braces followed by + * the local name if it is in a namespace, for example: + *
    + *
  • "encoding" + *
  • "method" + *
  • "{http://xml.apache.org/xalan}indent-amount" + *
  • "{http://xml.apache.org/xalan}line-separator" + *
+ * @val The default value of the parameter + */ + public void setOutputPropertyDefault(String name, String val); }