OpenJDK / jdk10 / sandbox / jaxws
changeset 845:0b6f442e81fe JDK-8182159-branch
Merge
author | erikj |
---|---|
date | Mon, 10 Jul 2017 15:54:38 +0200 |
parents | 9a3a53278d23 6d17fd0a5133 |
children | 96714d632d9c |
files | src/java.xml.ws/share/classes/javax/xml/ws/handler/package.html src/java.xml.ws/share/classes/javax/xml/ws/handler/soap/package.html src/java.xml.ws/share/classes/javax/xml/ws/http/package.html src/java.xml.ws/share/classes/javax/xml/ws/soap/package.html src/java.xml.ws/share/classes/javax/xml/ws/spi/package.html src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/resources/newmessages.properties |
diffstat | 263 files changed, 11638 insertions(+), 9698 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Wed Jun 14 11:19:42 2017 +0200 +++ b/.hgtags Mon Jul 10 15:54:38 2017 +0200 @@ -430,3 +430,11 @@ 3ccd9f37faa601866db5edb827363e797f5a2493 jdk-10+10 8c615099f3e3ca137325be34bf566b767d9e3c64 jdk-9+172 2d22d6732a73e615b9e13d6bc93bf026db3bc231 jdk-10+11 +2bd967aa452c1e0e87a6173bef6fbb96ef1c521b jdk-9+173 +c2296642010f1b215ac35da89e92c3ce44104e32 jdk-9+174 +712a3a657654079514590d37a0f4894d43541d5c jdk-10+12 +a5d361b9d1f7f78a675f3baef0d1fd32deee9ea2 jdk-9+175 +46a14aad004aa0b980d5f4ff7810d894fd5a36ae jdk-10+13 +bddeaa49ffd55567ad232548c38aa270e1a1420a jdk-10+14 +ea819b6009d33a72e6672bab6c101d51db0cfb4c jdk-9+176 +b44a721aee3d3b2537754e559fe9ecccadea548b jdk-9+177
--- a/.jcheck/conf Wed Jun 14 11:19:42 2017 +0200 +++ b/.jcheck/conf Mon Jul 10 15:54:38 2017 +0200 @@ -1,1 +1,2 @@ project=jdk10 +bugids=dup
--- a/src/java.activation/share/classes/javax/activation/CommandInfo.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/CommandInfo.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -118,6 +118,9 @@ * passed to the command. * @param loader The ClassLoader to be used to instantiate the bean. * @return The bean + * @exception IOException for failures reading data + * @exception ClassNotFoundException if command object class can't + * be found * @see java.beans.Beans#instantiate * @see javax.activation.CommandObject */
--- a/src/java.activation/share/classes/javax/activation/CommandObject.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/CommandObject.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -48,6 +48,7 @@ * * @param verb The Command Verb this object refers to. * @param dh The DataHandler. + * @exception IOException for failures accessing data */ public void setCommandContext(String verb, DataHandler dh) throws IOException;
--- a/src/java.activation/share/classes/javax/activation/DataHandler.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/DataHandler.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -326,6 +326,7 @@ * Otherwise, {@code null} is returned. * * @return the OutputStream + * @exception IOException for failures creating the OutputStream * * @see javax.activation.DataSource#getOutputStream * @see javax.activation.URLDataSource
--- a/src/java.activation/share/classes/javax/activation/DataSource.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/DataSource.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -49,6 +49,7 @@ * positioned at the beginning of the data. * * @return an InputStream + * @exception IOException for failures creating the InputStream */ public InputStream getInputStream() throws IOException; @@ -60,6 +61,7 @@ * be positioned at the location the data is to be written. * * @return an OutputStream + * @exception IOException for failures creating the OutputStream */ public OutputStream getOutputStream() throws IOException;
--- a/src/java.activation/share/classes/javax/activation/MailcapCommandMap.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/MailcapCommandMap.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -29,6 +29,8 @@ import java.util.*; import java.io.*; import java.net.*; +import java.security.AccessController; +import java.security.PrivilegedAction; import com.sun.activation.registries.MailcapFile; import com.sun.activation.registries.LogSupport; @@ -48,12 +50,19 @@ * <ol> * <li> Programatically added entries to the MailcapCommandMap instance. * <li> The file {@code .mailcap} in the user's home directory. - * <li> The file {@literal <}<i>java.home</i>{@literal >}{@code /lib/mailcap}. + * <li> The file {@code mailcap} in the Java runtime. * <li> The file or resources named {@code META-INF/mailcap}. * <li> The file or resource named {@code META-INF/mailcap.default} * (usually found only in the {@code activation.jar} file). * </ol> * <p> + * (The current implementation looks for the {@code mailcap} file + * in the Java runtime in the directory <i>java.home</i>{@code /conf} + * if it exists, and otherwise in the directory + * <i>java.home</i>{@code /lib}, where <i>java.home</i> is the value + * of the "java.home" System property. Note that the "conf" directory was + * introduced in JDK 9.) + * <p> * <b>Mailcap file format:</b><p> * * Mailcap files must conform to the mailcap @@ -120,6 +129,29 @@ private MailcapFile[] DB; private static final int PROG = 0; // programmatically added entries + private static final String confDir; + + static { + String dir = null; + try { + dir = (String)AccessController.doPrivileged( + new PrivilegedAction() { + public Object run() { + String home = System.getProperty("java.home"); + String newdir = home + File.separator + "conf"; + File conf = new File(newdir); + if (conf.exists()) + return newdir + File.separator; + else + return home + File.separator + "lib" + File.separator; + } + }); + } catch (Exception ex) { + // ignore any exceptions + } + confDir = dir; + } + /** * The default Constructor. */ @@ -144,11 +176,11 @@ LogSupport.log("MailcapCommandMap: load SYS"); try { // check system's home - String system_mailcap = System.getProperty("java.home") + - File.separator + "lib" + File.separator + "mailcap"; - mf = loadFile(system_mailcap); - if (mf != null) - dbv.add(mf); + if (confDir != null) { + mf = loadFile(confDir + "mailcap"); + if (mf != null) + dbv.add(mf); + } } catch (SecurityException ex) {} LogSupport.log("MailcapCommandMap: load JAR"); @@ -633,6 +665,7 @@ * entries that specify a view command for the specified * MIME type are returned. * + * @param mimeType the MIME type * @return array of native command entries * @since 1.6, JAF 1.1 */
--- a/src/java.activation/share/classes/javax/activation/MimeType.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/MimeType.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -58,6 +58,7 @@ * Constructor that builds a MimeType from a String. * * @param rawdata the MIME type string + * @exception MimeTypeParseException if the MIME type can't be parsed */ public MimeType(String rawdata) throws MimeTypeParseException { parse(rawdata); @@ -258,6 +259,7 @@ * * @param rawdata the MIME type string to compare with * @return true if they match + * @exception MimeTypeParseException if the MIME type can't be parsed */ public boolean match(String rawdata) throws MimeTypeParseException { return match(new MimeType(rawdata));
--- a/src/java.activation/share/classes/javax/activation/MimeTypeParameterList.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/MimeTypeParameterList.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -58,6 +58,7 @@ * Constructs a new MimeTypeParameterList with the passed in data. * * @param parameterList an RFC 2045, 2046 compliant parameter list. + * @exception MimeTypeParseException if the MIME type can't be parsed */ public MimeTypeParameterList(String parameterList) throws MimeTypeParseException { @@ -71,6 +72,7 @@ * A routine for parsing the parameter list out of a String. * * @param parameterList an RFC 2045, 2046 compliant parameter list. + * @exception MimeTypeParseException if the MIME type can't be parsed */ protected void parse(String parameterList) throws MimeTypeParseException { if (parameterList == null)
--- a/src/java.activation/share/classes/javax/activation/MimetypesFileTypeMap.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/javax/activation/MimetypesFileTypeMap.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -28,6 +28,8 @@ import java.io.*; import java.net.*; import java.util.*; +import java.security.AccessController; +import java.security.PrivilegedAction; import com.sun.activation.registries.MimeTypeFile; import com.sun.activation.registries.LogSupport; @@ -43,12 +45,19 @@ * <ol> * <li> Programmatically added entries to the MimetypesFileTypeMap instance. * <li> The file {@code .mime.types} in the user's home directory. - * <li> The file {@literal <}<i>java.home</i>{@literal >}{@code /lib/mime.types}. + * <li> The file {@code mime.types} in the Java runtime. * <li> The file or resources named {@code META-INF/mime.types}. * <li> The file or resource named {@code META-INF/mimetypes.default} * (usually found only in the {@code activation.jar} file). * </ol> * <p> + * (The current implementation looks for the {@code mime.types} file + * in the Java runtime in the directory <i>java.home</i>{@code /conf} + * if it exists, and otherwise in the directory + * <i>java.home</i>{@code /lib}, where <i>java.home</i> is the value + * of the "java.home" System property. Note that the "conf" directory was + * introduced in JDK 9.) + * <p> * <b>MIME types file format:</b> * * <pre>{@code @@ -72,7 +81,30 @@ private MimeTypeFile[] DB; private static final int PROG = 0; // programmatically added entries - private static String defaultType = "application/octet-stream"; + private static final String defaultType = "application/octet-stream"; + + private static final String confDir; + + static { + String dir = null; + try { + dir = (String)AccessController.doPrivileged( + new PrivilegedAction() { + public Object run() { + String home = System.getProperty("java.home"); + String newdir = home + File.separator + "conf"; + File conf = new File(newdir); + if (conf.exists()) + return newdir + File.separator; + else + return home + File.separator + "lib" + File.separator; + } + }); + } catch (Exception ex) { + // ignore any exceptions + } + confDir = dir; + } /** * The default constructor. @@ -97,11 +129,11 @@ LogSupport.log("MimetypesFileTypeMap: load SYS"); try { // check system's home - String system_mimetypes = System.getProperty("java.home") + - File.separator + "lib" + File.separator + "mime.types"; - mf = loadFile(system_mimetypes); - if (mf != null) - dbv.addElement(mf); + if (confDir != null) { + mf = loadFile(confDir + "mime.types"); + if (mf != null) + dbv.addElement(mf); + } } catch (SecurityException ex) {} LogSupport.log("MimetypesFileTypeMap: load JAR"); @@ -239,6 +271,7 @@ * added from the named file. * * @param mimeTypeFileName the file name + * @exception IOException for errors reading the file */ public MimetypesFileTypeMap(String mimeTypeFileName) throws IOException { this();
--- a/src/java.activation/share/classes/module-info.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.activation/share/classes/module-info.java Mon Jul 10 15:54:38 2017 +0200 @@ -26,13 +26,16 @@ /** * Defines the JavaBeans Activation Framework (JAF) API. * + * <p> This module is upgradeable. + * * @moduleGraph * @since 9 */ @Deprecated(since="9", forRemoval=true) module java.activation { + requires java.logging; + requires transitive java.datatransfer; - requires java.logging; exports javax.activation; }
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/marshaller/MinimumEscapeHandler.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/marshaller/MinimumEscapeHandler.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -48,10 +48,10 @@ int limit = start+length; for (int i = start; i < limit; i++) { char c = ch[i]; - if(c == '&' || c == '<' || c == '>' || c == '\r' || (c == '\"' && isAttVal) ) { - if(i!=start) - out.write(ch,start,i-start); - start = i+1; + if (c == '&' || c == '<' || c == '>' || c == '\r' || (c == '\n' && isAttVal) || (c == '\"' && isAttVal)) { + if (i != start) + out.write(ch, start, i - start); + start = i + 1; switch (ch[i]) { case '&': out.write("&"); @@ -65,6 +65,14 @@ case '\"': out.write("""); break; + case '\n': + case '\r': + out.write("&#"); + out.write(Integer.toString(c)); + out.write(';'); + break; + default: + throw new IllegalArgumentException("Cannot escape: '" + c + "'"); } } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/marshaller/NoEscapeHandler.java Mon Jul 10 15:54:38 2017 +0200 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.sun.xml.internal.bind.marshaller; + +import java.io.IOException; +import java.io.Writer; + +/** + * Performs no character escaping. + * + * @author + * Roman Grigoriadi (roman.grigoriadi@oracle.com) + */ +public class NoEscapeHandler implements CharacterEscapeHandler { + + public static final NoEscapeHandler theInstance = new NoEscapeHandler(); + + @Override + public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException { + out.write(ch, start, length); + } +}
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/BridgeImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/BridgeImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -76,7 +76,7 @@ public void marshal(Marshaller _m, T t, XMLStreamWriter output) throws JAXBException { MarshallerImpl m = (MarshallerImpl)_m; - m.write(tagName,bi,t,XMLStreamWriterOutput.create(output,context),new StAXPostInitAction(output,m.serializer)); + m.write(tagName,bi,t,XMLStreamWriterOutput.create(output,context, m.getEscapeHandler()),new StAXPostInitAction(output,m.serializer)); } public void marshal(Marshaller _m, T t, OutputStream output, NamespaceContext nsContext) throws JAXBException {
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/MarshallerImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/MarshallerImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -165,7 +165,7 @@ @Override public void marshal(Object obj, XMLStreamWriter writer) throws JAXBException { - write(obj, XMLStreamWriterOutput.create(writer,context), new StAXPostInitAction(writer,serializer)); + write(obj, XMLStreamWriterOutput.create(writer,context, escapeHandler), new StAXPostInitAction(writer,serializer)); } @Override @@ -371,6 +371,15 @@ } + /** + * Returns escape handler provided with JAXB context parameters. + * + * @return escape handler + */ + CharacterEscapeHandler getEscapeHandler() { + return escapeHandler; + } + // // // create XMLWriter by specifing various type of output. @@ -436,13 +445,14 @@ if(encoding.equals("UTF-8")) { Encoded[] table = context.getUTF8NameTable(); final UTF8XmlOutput out; + CharacterEscapeHandler ceh = createEscapeHandler(encoding); if(isFormattedOutput()) - out = new IndentingUTF8XmlOutput(os, indent, table, escapeHandler); + out = new IndentingUTF8XmlOutput(os, indent, table, ceh); else { if(c14nSupport) - out = new C14nXmlOutput(os, table, context.c14nSupport, escapeHandler); + out = new C14nXmlOutput(os, table, context.c14nSupport, ceh); else - out = new UTF8XmlOutput(os, table, escapeHandler); + out = new UTF8XmlOutput(os, table, ceh); } if(header!=null) out.setHeader(header);
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/FastInfosetStreamWriterOutput.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/FastInfosetStreamWriterOutput.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -25,21 +25,22 @@ package com.sun.xml.internal.bind.v2.runtime.output; +import com.sun.xml.internal.bind.marshaller.NoEscapeHandler; import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl; import com.sun.xml.internal.bind.v2.runtime.Name; import com.sun.xml.internal.bind.v2.runtime.XMLSerializer; -import javax.xml.stream.XMLStreamException; - import com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data; import com.sun.xml.internal.fastinfoset.EncodingConstants; import com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer; +import com.sun.xml.internal.org.jvnet.fastinfoset.VocabularyApplicationData; +import org.xml.sax.SAXException; + +import javax.xml.bind.JAXBContext; +import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.util.Collection; import java.util.Map; import java.util.WeakHashMap; -import javax.xml.bind.JAXBContext; -import com.sun.xml.internal.org.jvnet.fastinfoset.VocabularyApplicationData; -import org.xml.sax.SAXException; /** * {@link XmlOutput} for {@link StAXDocumentSerializer}. @@ -220,7 +221,7 @@ public FastInfosetStreamWriterOutput(StAXDocumentSerializer out, JAXBContextImpl context) { - super(out); + super(out, NoEscapeHandler.theInstance); this.fiout = out; this.localNames = context.getUTF8NameTable();
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/StAXExStreamWriterOutput.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/StAXExStreamWriterOutput.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; +import com.sun.xml.internal.bind.marshaller.NoEscapeHandler; import com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data; import com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx; @@ -40,7 +41,7 @@ private final XMLStreamWriterEx out; public StAXExStreamWriterOutput(XMLStreamWriterEx out) { - super(out); + super(out, NoEscapeHandler.theInstance); this.out = out; }
--- a/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -26,15 +26,16 @@ package com.sun.xml.internal.bind.v2.runtime.output; import java.io.IOException; +import java.io.Writer; import java.lang.reflect.Constructor; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler; import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl; import com.sun.xml.internal.bind.v2.runtime.XMLSerializer; -import com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl; import org.xml.sax.SAXException; /** @@ -53,7 +54,7 @@ * Creates a new {@link XmlOutput} from a {@link XMLStreamWriter}. * This method recognizes an FI StAX writer. */ - public static XmlOutput create(XMLStreamWriter out, JAXBContextImpl context) { + public static XmlOutput create(XMLStreamWriter out, JAXBContextImpl context, CharacterEscapeHandler escapeHandler) { // try optimized path final Class writerClass = out.getClass(); if (writerClass==FI_STAX_WRITER_CLASS) { @@ -69,17 +70,26 @@ } } + CharacterEscapeHandler xmlStreamEscapeHandler = escapeHandler != null ? + escapeHandler : NewLineEscapeHandler.theInstance; + // otherwise the normal writer. - return new XMLStreamWriterOutput(out); + return new XMLStreamWriterOutput(out, xmlStreamEscapeHandler); } private final XMLStreamWriter out; + private final CharacterEscapeHandler escapeHandler; + + private final XmlStreamOutWriterAdapter writerWrapper; + protected final char[] buf = new char[256]; - protected XMLStreamWriterOutput(XMLStreamWriter out) { + protected XMLStreamWriterOutput(XMLStreamWriter out, CharacterEscapeHandler escapeHandler) { this.out = out; + this.escapeHandler = escapeHandler; + this.writerWrapper = new XmlStreamOutWriterAdapter(out); } // not called if we are generating fragments @@ -137,7 +147,7 @@ public void text(String value, boolean needsSeparatingWhitespace) throws IOException, SAXException, XMLStreamException { if(needsSeparatingWhitespace) out.writeCharacters(" "); - out.writeCharacters(value); + escapeHandler.escape(value.toCharArray(), 0, value.length(), false, writerWrapper); } public void text(Pcdata value, boolean needsSeparatingWhitespace) throws IOException, SAXException, XMLStreamException { @@ -207,4 +217,81 @@ } } + /** + * Performs character escaping only for new lines. + */ + private static class NewLineEscapeHandler implements CharacterEscapeHandler { + + public static final NewLineEscapeHandler theInstance = new NewLineEscapeHandler(); + + @Override + public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException { + int limit = start+length; + int lastEscaped = start; + for (int i = start; i < limit; i++) { + char c = ch[i]; + if (c == '\r' || c == '\n') { + if (i != lastEscaped) { + out.write(ch, lastEscaped, i - lastEscaped); + } + lastEscaped = i + 1; + if (out instanceof XmlStreamOutWriterAdapter) { + try { + ((XmlStreamOutWriterAdapter)out).writeEntityRef("#x" + Integer.toHexString(c)); + } catch (XMLStreamException e) { + throw new IOException("Error writing xml stream", e); + } + } else { + out.write("&#x"); + out.write(Integer.toHexString(c)); + out.write(';'); + } + } + } + + if (lastEscaped != limit) { + out.write(ch, lastEscaped, length - lastEscaped); + } + } + } + + private static final class XmlStreamOutWriterAdapter extends Writer { + + private final XMLStreamWriter writer; + + private XmlStreamOutWriterAdapter(XMLStreamWriter writer) { + this.writer = writer; + } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + try { + writer.writeCharacters(cbuf, off, len); + } catch (XMLStreamException e) { + throw new IOException("Error writing XML stream", e); + } + } + + public void writeEntityRef(String entityReference) throws XMLStreamException { + writer.writeEntityRef(entityReference); + } + + @Override + public void flush() throws IOException { + try { + writer.flush(); + } catch (XMLStreamException e) { + throw new IOException("Error flushing XML stream", e); + } + } + + @Override + public void close() throws IOException { + try { + writer.close(); + } catch (XMLStreamException e) { + throw new IOException("Error closing XML stream", e); + } + } + } }
--- a/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Mon Jul 10 15:54:38 2017 +0200 @@ -150,13 +150,14 @@ * Create an instance of a class using the specified ClassLoader */ static JAXBContext newInstance(String contextPath, + Class[] contextPathClasses, String className, ClassLoader classLoader, Map properties) throws JAXBException { try { Class spFactory = ServiceLoaderUtil.safeLoadClass(className, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader); - return newInstance(contextPath, spFactory, classLoader, properties); + return newInstance(contextPath, contextPathClasses, spFactory, classLoader, properties); } catch (ClassNotFoundException x) { throw new JAXBException(Messages.format(Messages.DEFAULT_PROVIDER_NOT_FOUND), x); @@ -175,6 +176,7 @@ } static JAXBContext newInstance(String contextPath, + Class[] contextPathClasses, Class spFactory, ClassLoader classLoader, Map properties) throws JAXBException { @@ -212,6 +214,9 @@ // the cast would fail, so generate an exception with a nice message throw handleClassCastException(context.getClass(), JAXBContext.class); } + + ModuleUtil.delegateAddOpensToImplModule(contextPathClasses, spFactory); + return (JAXBContext) context; } catch (InvocationTargetException x) { // throw if it is exception not to be wrapped @@ -277,6 +282,7 @@ // the cast would fail, so generate an exception with a nice message throw handleClassCastException(context.getClass(), JAXBContext.class); } + ModuleUtil.delegateAddOpensToImplModule(classes, spFactory); return (JAXBContext) context; } catch (NoSuchMethodException | IllegalAccessException e) { @@ -295,50 +301,52 @@ ClassLoader classLoader, Map properties) throws JAXBException { - StringTokenizer packages = new StringTokenizer(contextPath, ":"); - if (!packages.hasMoreTokens()) { + if (contextPath == null || contextPath.isEmpty()) { // no context is specified throw new JAXBException(Messages.format(Messages.NO_PACKAGE_IN_CONTEXTPATH)); } - // search for jaxb.properties in the class loader of each class first - logger.fine("Searching jaxb.properties"); - while (packages.hasMoreTokens()) { - // com.acme.foo - > com/acme/foo/jaxb.properties - String factoryClassName = - classNameFromPackageProperties( - classLoader, - packages.nextToken(":").replace('.', '/'), - factoryId, - JAXB_CONTEXT_FACTORY_DEPRECATED); + //ModuleUtil is mr-jar class, scans context path for jaxb classes on jdk9 and higher + Class[] contextPathClasses = ModuleUtil.getClassesFromContextPath(contextPath, classLoader); - if (factoryClassName != null) { - return newInstance(contextPath, factoryClassName, classLoader, properties); - } + //first try with classloader#getResource + String factoryClassName = jaxbProperties(contextPath, classLoader, factoryId); + if (factoryClassName == null && contextPathClasses != null) { + //try with class#getResource + factoryClassName = jaxbProperties(contextPathClasses, factoryId); } + if (factoryClassName != null) { + return newInstance(contextPath, contextPathClasses, factoryClassName, classLoader, properties); + } + + String factoryName = classNameFromSystemProperties(); - if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); + if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties); JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader( JAXBContextFactory.class, logger, EXCEPTION_HANDLER); - if (obj != null) return obj.createContext(contextPath, classLoader, properties); + if (obj != null) { + JAXBContext context = obj.createContext(contextPath, classLoader, properties); + ModuleUtil.delegateAddOpensToImplModule(contextPathClasses, obj.getClass()); + return context; + } // to ensure backwards compatibility factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader); - if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); + if (factoryName != null) return newInstance(contextPath, contextPathClasses, factoryName, classLoader, properties); Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader( "javax.xml.bind.JAXBContext", logger); if (ctxFactory != null) { - return newInstance(contextPath, ctxFactory, classLoader, properties); + return newInstance(contextPath, contextPathClasses, ctxFactory, classLoader, properties); } // else no provider found logger.fine("Trying to create the platform default provider"); - return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties); + return newInstance(contextPath, contextPathClasses, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties); } static JAXBContext find(Class<?>[] classes, Map<String, ?> properties) throws JAXBException { @@ -356,13 +364,18 @@ // TODO: it's easier to look things up from the class // c.getResourceAsStream("jaxb.properties"); - String factoryClassName = - classNameFromPackageProperties( - getClassClassLoader(c), - c.getPackage().getName().replace('.', '/'), - JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); + URL jaxbPropertiesUrl = getResourceUrl(c, "jaxb.properties"); + + if (jaxbPropertiesUrl != null) { - if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); + String factoryClassName = + classNameFromPackageProperties( + jaxbPropertiesUrl, + JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); + + return newInstance(classes, properties, factoryClassName); + } + } String factoryClassName = classNameFromSystemProperties(); @@ -371,7 +384,11 @@ JAXBContextFactory factory = ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER); - if (factory != null) return factory.createContext(classes, properties); + if (factory != null) { + JAXBContext context = factory.createContext(classes, properties); + ModuleUtil.delegateAddOpensToImplModule(classes, factory.getClass()); + return context; + } // to ensure backwards compatibility String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader()); @@ -395,22 +412,20 @@ * first factoryId should be the preferred one, * more of those can be provided to support backwards compatibility */ - private static String classNameFromPackageProperties(ClassLoader classLoader, - String packageName, + private static String classNameFromPackageProperties(URL packagePropertiesUrl, String ... factoryIds) throws JAXBException { - String resourceName = packageName + "/jaxb.properties"; - logger.log(Level.FINE, "Trying to locate {0}", resourceName); - Properties props = loadJAXBProperties(classLoader, resourceName); - if (props != null) { - for(String factoryId : factoryIds) { - if (props.containsKey(factoryId)) { - return props.getProperty(factoryId); - } + logger.log(Level.FINE, "Trying to locate {0}", packagePropertiesUrl.toString()); + Properties props = loadJAXBProperties(packagePropertiesUrl); + for(String factoryId : factoryIds) { + if (props.containsKey(factoryId)) { + return props.getProperty(factoryId); } - throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0])); } - return null; + //Factory key not found + String propertiesUrl = packagePropertiesUrl.toExternalForm(); + String packageName = propertiesUrl.substring(0, propertiesUrl.indexOf("/jaxb.properties")); + throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0])); } private static String classNameFromSystemProperties() throws JAXBException { @@ -452,30 +467,40 @@ return value; } - private static Properties loadJAXBProperties(ClassLoader classLoader, - String propFileName) throws JAXBException { + private static Properties loadJAXBProperties(URL url) throws JAXBException { - Properties props = null; try { - URL url; - if (classLoader == null) - url = ClassLoader.getSystemResource(propFileName); - else - url = classLoader.getResource(propFileName); - - if (url != null) { - logger.log(Level.FINE, "loading props from {0}", url); - props = new Properties(); - InputStream is = url.openStream(); - props.load(is); - is.close(); - } + Properties props; + logger.log(Level.FINE, "loading props from {0}", url); + props = new Properties(); + InputStream is = url.openStream(); + props.load(is); + is.close(); + return props; } catch (IOException ioe) { - logger.log(Level.FINE, "Unable to load " + propFileName, ioe); + logger.log(Level.FINE, "Unable to load " + url.toString(), ioe); throw new JAXBException(ioe.toString(), ioe); } + } - return props; + /** + * If run on JPMS package containing resource must be open unconditionally. + * + * @param classLoader classloader to load resource with + * @param resourceName qualified name of the resource + * @return resource url if found + */ + private static URL getResourceUrl(ClassLoader classLoader, String resourceName) { + URL url; + if (classLoader == null) + url = ClassLoader.getSystemResource(resourceName); + else + url = classLoader.getResource(resourceName); + return url; + } + + private static URL getResourceUrl(Class<?> clazz, String resourceName) { + return clazz.getResource(resourceName); } @@ -606,4 +631,28 @@ } } + private static String jaxbProperties(String contextPath, ClassLoader classLoader, String factoryId) throws JAXBException { + String[] packages = contextPath.split(":"); + + for (String pkg : packages) { + String pkgUrl = pkg.replace('.', '/'); + URL jaxbPropertiesUrl = getResourceUrl(classLoader, pkgUrl + "/jaxb.properties"); + if (jaxbPropertiesUrl != null) { + return classNameFromPackageProperties(jaxbPropertiesUrl, + factoryId, JAXB_CONTEXT_FACTORY_DEPRECATED); + } + } + return null; + } + + private static String jaxbProperties(Class[] classesFromContextPath, String factoryId) throws JAXBException { + for (Class c : classesFromContextPath) { + URL jaxbPropertiesUrl = getResourceUrl(c, "jaxb.properties"); + if (jaxbPropertiesUrl != null) { + return classNameFromPackageProperties(jaxbPropertiesUrl, factoryId, JAXB_CONTEXT_FACTORY_DEPRECATED); + } + } + return null; + } + }
--- a/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, 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 @@ -27,11 +27,11 @@ import org.w3c.dom.Node; +import java.io.IOException; +import java.io.InputStream; import java.util.Collections; import java.util.Map; import java.util.Properties; -import java.io.IOException; -import java.io.InputStream; /** * The {@code JAXBContext} class provides the client's entry point to the @@ -227,6 +227,9 @@ * This phase of the look up allows some packages to force the use of a certain JAXB implementation. * (For example, perhaps the schema compiler has generated some vendor extension in the code.) * + * <p> + * This configuration method is deprecated. + * * <li> * If the system property {@link #JAXB_CONTEXT_FACTORY} exists, then its value is assumed to be the provider * factory class. If no such property exists, properties {@code "javax.xml.bind.context.factory"} and @@ -332,7 +335,14 @@ * the context class loader of the current thread. * * @throws JAXBException if an error was encountered while creating the - * {@code JAXBContext}. See {@link JAXBContext#newInstance(String, ClassLoader, Map)} for details. + * {@code JAXBContext} such as + * <ol> + * <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li> + * <li>an ambiguity among global elements contained in the contextPath</li> + * <li>failure to locate a value for the context factory provider property</li> + * <li>mixing schema derived packages from different providers on the same contextPath</li> + * <li>packages are not open to {@code java.xml.bind} module</li> + * </ol> */ public static JAXBContext newInstance( String contextPath ) throws JAXBException { @@ -414,16 +424,26 @@ * <p> * The steps involved in discovering the JAXB implementation is discussed in the class javadoc. * - * @param contextPath list of java package names that contain schema - * derived class and/or java to schema (JAXB-annotated) - * mapped classes + * @param contextPath + * List of java package names that contain schema + * derived class and/or java to schema (JAXB-annotated) + * mapped classes. + * Packages in {@code contextPath} that are in named modules must be + * {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * @param classLoader * This class loader will be used to locate the implementation * classes. * * @return a new instance of a {@code JAXBContext} * @throws JAXBException if an error was encountered while creating the - * {@code JAXBContext}. See {@link JAXBContext#newInstance(String, ClassLoader, Map)} for details. + * {@code JAXBContext} such as + * <ol> + * <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li> + * <li>an ambiguity among global elements contained in the contextPath</li> + * <li>failure to locate a value for the context factory provider property</li> + * <li>mixing schema derived packages from different providers on the same contextPath</li> + * <li>packages are not open to {@code java.xml.bind} module</li> + * </ol> */ public static JAXBContext newInstance( String contextPath, ClassLoader classLoader ) throws JAXBException { @@ -442,7 +462,12 @@ * The interpretation of properties is up to implementations. Implementations must * throw {@code JAXBException} if it finds properties that it doesn't understand. * - * @param contextPath list of java package names that contain schema derived classes + * @param contextPath + * List of java package names that contain schema + * derived class and/or java to schema (JAXB-annotated) + * mapped classes. + * Packages in {@code contextPath} that are in named modules must be + * {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * @param classLoader * This class loader will be used to locate the implementation classes. * @param properties @@ -457,6 +482,7 @@ * <li>an ambiguity among global elements contained in the contextPath</li> * <li>failure to locate a value for the context factory provider property</li> * <li>mixing schema derived packages from different providers on the same contextPath</li> + * <li>packages are not open to {@code java.xml.bind} module</li> * </ol> * @since 1.6, JAXB 2.0 */ @@ -588,15 +614,27 @@ * The steps involved in discovering the JAXB implementation is discussed in the class javadoc. * * @param classesToBeBound - * list of java classes to be recognized by the new {@link JAXBContext}. + * List of java classes to be recognized by the new {@link JAXBContext}. + * Classes in {@code classesToBeBound} that are in named modules must be in a package + * that is {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * Can be empty, in which case a {@link JAXBContext} that only knows about * spec-defined classes will be returned. * * @return * A new instance of a {@code JAXBContext}. * - * @throws JAXBException if an error was encountered while creating the - * {@code JAXBContext}. See {@link JAXBContext#newInstance(Class[], Map)} for details. + * @throws JAXBException + * if an error was encountered while creating the + * {@code JAXBContext}, such as (but not limited to): + * <ol> + * <li>No JAXB implementation was discovered + * <li>Classes use JAXB annotations incorrectly + * <li>Classes have colliding annotations (i.e., two classes with the same type name) + * <li>The JAXB implementation was unable to locate + * provider-specific out-of-band information (such as additional + * files generated at the development time.) + * <li>{@code classesToBeBound} are not open to {@code java.xml.bind} module + * </ol> * * @throws IllegalArgumentException * if the parameter contains {@code null} (i.e., {@code newInstance(null);}) @@ -621,7 +659,9 @@ * throw {@code JAXBException} if it finds properties that it doesn't understand. * * @param classesToBeBound - * list of java classes to be recognized by the new {@link JAXBContext}. + * List of java classes to be recognized by the new {@link JAXBContext}. + * Classes in {@code classesToBeBound} that are in named modules must be in a package + * that is {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * Can be empty, in which case a {@link JAXBContext} that only knows about * spec-defined classes will be returned. * @param properties @@ -641,6 +681,7 @@ * <li>The JAXB implementation was unable to locate * provider-specific out-of-band information (such as additional * files generated at the development time.) + * <li>{@code classesToBeBound} are not open to {@code java.xml.bind} module * </ol> * * @throws IllegalArgumentException @@ -702,6 +743,7 @@ * {@code Validator} object * @deprecated since JAXB2.0 */ + @Deprecated public abstract Validator createValidator() throws JAXBException; /**
--- a/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -44,7 +44,9 @@ * For semantics see {@link javax.xml.bind.JAXBContext#newInstance(Class[], java.util.Map)} * * @param classesToBeBound - * list of java classes to be recognized by the new {@link JAXBContext}. + * List of java classes to be recognized by the new {@link JAXBContext}. + * Classes in {@code classesToBeBound} that are in named modules must be in a package + * that is {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * Can be empty, in which case a {@link JAXBContext} that only knows about * spec-defined classes will be returned. * @param properties @@ -56,7 +58,16 @@ * * @throws JAXBException * if an error was encountered while creating the - * {@code JAXBContext}. See {@link JAXBContext#newInstance(Class[], Map)} for details. + * {@code JAXBContext}, such as (but not limited to): + * <ol> + * <li>No JAXB implementation was discovered + * <li>Classes use JAXB annotations incorrectly + * <li>Classes have colliding annotations (i.e., two classes with the same type name) + * <li>The JAXB implementation was unable to locate + * provider-specific out-of-band information (such as additional + * files generated at the development time.) + * <li>{@code classesToBeBound} are not open to {@code java.xml.bind} module + * </ol> * * @throws IllegalArgumentException * if the parameter contains {@code null} (i.e., {@code newInstance(null,someMap);}) @@ -77,7 +88,10 @@ * The interpretation of properties is up to implementations. Implementations must * throw {@code JAXBException} if it finds properties that it doesn't understand. * - * @param contextPath list of java package names that contain schema derived classes + * @param contextPath + * List of java package names that contain schema derived classes. + * Classes in {@code classesToBeBound} that are in named modules must be in a package + * that is {@linkplain java.lang.Module#isOpen open} to at least the {@code java.xml.bind} module. * @param classLoader * This class loader will be used to locate the implementation classes. * @param properties @@ -86,7 +100,14 @@ * * @return a new instance of a {@code JAXBContext} * @throws JAXBException if an error was encountered while creating the - * {@code JAXBContext}. See {@link JAXBContext#newInstance(String, ClassLoader, Map)} for details. + * {@code JAXBContext} such as + * <ol> + * <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li> + * <li>an ambiguity among global elements contained in the contextPath</li> + * <li>failure to locate a value for the context factory provider property</li> + * <li>mixing schema derived packages from different providers on the same contextPath</li> + * <li>packages are not open to {@code java.xml.bind} module</li> + * </ol> * * @since 9, JAXB 2.3 */
--- a/src/java.xml.bind/share/classes/javax/xml/bind/Messages.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/Messages.java Mon Jul 10 15:54:38 2017 +0200 @@ -91,4 +91,10 @@ static final String ILLEGAL_CAST = // 2 args "JAXBContext.IllegalCast"; + + static final String ERROR_LOAD_CLASS = // 2 args + "ContextFinder.ErrorLoadClass"; + + static final String JAXB_CLASSES_NOT_OPEN = // 1 arg + "JAXBClasses.notOpen"; }
--- a/src/java.xml.bind/share/classes/javax/xml/bind/Messages.properties Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/Messages.properties Mon Jul 10 15:54:38 2017 +0200 @@ -44,6 +44,11 @@ ContextFinder.NoPackageInContextPath = \ No package name is given +ContextFinder.ErrorLoadClass = \ + Error loading class {0} listed in {1}, make sure that entries are accessable \ + on CLASSPATH and of the form ClassName or OuterClass.InnerClass \ + not ClassName.class or fully.qualified.ClassName + PropertyException.NameValue = \ name: {0} value: {1} @@ -52,3 +57,6 @@ JAXBContext.IllegalCast = \ ClassCastException: attempting to cast {0} to {1}. Please make sure that you are specifying the proper ClassLoader. + +JAXBClasses.notOpen = \ + Package {0} with JAXB class {1} defined in a module {2} must be open to at least java.xml.bind module.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/ModuleUtil.java Mon Jul 10 15:54:38 2017 +0200 @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 javax.xml.bind; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.Module; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Propagates openness of JAXB annottated classess packages to JAXB impl module. + * + * @author Roman Grigoriadi + */ +class ModuleUtil { + + private static Logger logger = Logger.getLogger("javax.xml.bind"); + + /** + * Resolves classes from context path. + * Only one class per package is needed to access its {@link java.lang.Module} + */ + static Class[] getClassesFromContextPath(String contextPath, ClassLoader classLoader) throws JAXBException { + List<Class> classes = new ArrayList<>(); + if (contextPath == null || contextPath.isEmpty()){ + return classes.toArray(new Class[]{}); + } + + String [] tokens = contextPath.split(":"); + for (String pkg : tokens){ + + // look for ObjectFactory and load it + final Class<?> o; + try { + o = classLoader.loadClass(pkg+".ObjectFactory"); + classes.add(o); + continue; + } catch (ClassNotFoundException e) { + // not necessarily an error + } + + // look for jaxb.index and load the list of classes + try { + final Class firstByJaxbIndex = findFirstByJaxbIndex(pkg, classLoader); + if (firstByJaxbIndex != null) { + classes.add(firstByJaxbIndex); + } + } catch (IOException e) { + throw new JAXBException(e); + } + } + + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Resolved classes from context path: {0}", classes); + } + return classes.toArray(new Class[]{}); + } + + /** + * Find first class in package by {@code jaxb.index} file. + */ + static Class findFirstByJaxbIndex(String pkg, ClassLoader classLoader) throws IOException, JAXBException { + final String resource = pkg.replace('.', '/') + "/jaxb.index"; + final InputStream resourceAsStream = classLoader.getResourceAsStream(resource); + + if (resourceAsStream == null) { + return null; + } + + BufferedReader in = + new BufferedReader(new InputStreamReader(resourceAsStream, "UTF-8")); + try { + String className = in.readLine(); + while (className != null) { + className = className.trim(); + if (className.startsWith("#") || (className.length() == 0)) { + className = in.readLine(); + continue; + } + + try { + return classLoader.loadClass(pkg + '.' + className); + } catch (ClassNotFoundException e) { + throw new JAXBException(Messages.format(Messages.ERROR_LOAD_CLASS, className, pkg), e); + } + + } + } finally { + in.close(); + } + return null; + } + + /** + * Implementation may be defined in other module than {@code java.xml.bind}. In that case openness + * {@linkplain Module#isOpen open} of classes should be delegated to implementation module. + * + * @param classes used to resolve module for {@linkplain Module#addOpens(String, Module)} + * @param factorySPI used to resolve {@link Module} of the implementation. + * + * @throws JAXBException if ony of a classes package is not open to {@code java.xml.bind} module. + */ + static void delegateAddOpensToImplModule(Class[] classes, Class<?> factorySPI) throws JAXBException { + final Module implModule = factorySPI.getModule(); + if (!implModule.isNamed()) { + return; + } + + Module jaxbModule = JAXBContext.class.getModule(); + + for (Class cls : classes) { + final Module classModule = cls.getModule(); + final String packageName = cls.getPackageName(); + //no need for unnamed + if (!classModule.isNamed()) { + continue; + } + //report error if they are not open to java.xml.bind + if (!classModule.isOpen(packageName, jaxbModule)) { + throw new JAXBException(Messages.format(Messages.JAXB_CLASSES_NOT_OPEN, + packageName, cls.getName(), classModule.getName())); + } + //propagate openness to impl module + classModule.addOpens(packageName, implModule); + if (logger.isLoggable(Level.FINE)) { + logger.log(Level.FINE, "Propagating openness of package {0} in {1} to {2}.", + new String[]{ packageName, classModule.getName(), implModule.getName() }); + } + } + } + +}
--- a/src/java.xml.bind/share/classes/javax/xml/bind/Unmarshaller.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/javax/xml/bind/Unmarshaller.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, 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 @@ -23,6 +23,8 @@ * questions. */ + + package javax.xml.bind; import javax.xml.bind.annotation.adapters.XmlAdapter; @@ -975,7 +977,6 @@ * {@link #isValidating()} API as well as access to the Schema object. * To determine if the Unmarshaller has validation enabled, simply * test the return type for null: - * <p> * <pre>{@code * boolean isValidating = u.getSchema()!=null; * }</pre>
--- a/src/java.xml.bind/share/classes/module-info.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.bind/share/classes/module-info.java Mon Jul 10 15:54:38 2017 +0200 @@ -26,19 +26,22 @@ /** * Defines the Java Architecture for XML Binding (JAXB) API. * + * <p> This module is upgradeable. + * + * @uses javax.xml.bind.JAXBContextFactory + * * @moduleGraph * @since 9 */ @Deprecated(since="9", forRemoval=true) module java.xml.bind { - requires transitive java.activation; - requires transitive java.xml; requires java.compiler; requires java.desktop; requires java.logging; requires jdk.unsupported; - uses javax.xml.bind.JAXBContextFactory; + requires transitive java.activation; + requires transitive java.xml; exports javax.xml.bind; exports javax.xml.bind.annotation; @@ -46,6 +49,7 @@ exports javax.xml.bind.attachment; exports javax.xml.bind.helpers; exports javax.xml.bind.util; + exports com.sun.istack.internal to java.xml.ws, jdk.xml.bind, @@ -145,4 +149,7 @@ java.xml.ws, jdk.xml.bind, jdk.xml.ws; + + uses javax.xml.bind.JAXBContextFactory; + }
--- a/src/java.xml.ws.annotation/share/classes/module-info.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws.annotation/share/classes/module-info.java Mon Jul 10 15:54:38 2017 +0200 @@ -27,6 +27,8 @@ * Defines a subset of the Common Annotations API to support programs running * on the Java SE Platform. * + * <p> This module is upgradeable. + * * @moduleGraph * @since 9 */
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java Mon Jul 10 15:54:38 2017 +0200 @@ -76,6 +76,7 @@ } } + @Override public void close() throws SOAPException { if (closed) { log.severe("SAAJ0002.p2p.close.already.closed.conn"); @@ -86,6 +87,7 @@ closed = true; } + @Override public SOAPMessage call(SOAPMessage message, Object endPoint) throws SOAPException { if (closed) { @@ -348,6 +350,7 @@ // Object identifies where the request should be sent. // It is required to support objects of type String and java.net.URL. + @Override public SOAPMessage get(Object endPoint) throws SOAPException { if (closed) { log.severe("SAAJ0011.p2p.get.already.closed.conn");
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnectionFactory.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnectionFactory.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -34,6 +34,7 @@ */ public class HttpSOAPConnectionFactory extends SOAPConnectionFactory { + @Override public SOAPConnection createConnection() throws SOAPException {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/MessagingException.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/MessagingException.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -116,6 +116,7 @@ * Produce the message, include the message from the nested * exception if there is one. */ + @Override public String getMessage() { if (next == null) return super.getMessage();
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/BMMimeMultipart.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/BMMimeMultipart.java Mon Jul 10 15:54:38 2017 +0200 @@ -28,18 +28,20 @@ */ - package com.sun.xml.internal.messaging.saaj.packaging.mime.internet; -import java.io.*; -import java.util.BitSet; +import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException; +import com.sun.xml.internal.messaging.saaj.packaging.mime.util.ASCIIUtility; +import com.sun.xml.internal.messaging.saaj.packaging.mime.util.OutputUtil; +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; import javax.activation.DataSource; - -import com.sun.xml.internal.messaging.saaj.packaging.mime.*; -import com.sun.xml.internal.messaging.saaj.packaging.mime.util.*; - -import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.BitSet; /** * The MimeMultipart class is an implementation of the abstract Multipart @@ -67,11 +69,10 @@ * subtype by using the <code>MimeMultipart(String subtype)</code> * constructor. For example, to create a "multipart/alternative" object, * use <code>new MimeMultipart("alternative")</code>. - * */ //TODO: cleanup the SharedInputStream handling -public class BMMimeMultipart extends MimeMultipart { +public class BMMimeMultipart extends MimeMultipart { /* * When true it indicates parsing hasnt been done at all @@ -120,12 +121,12 @@ */ public BMMimeMultipart(String subtype) { super(subtype); - /* - * Compute a boundary string. - String boundary = UniqueValue.getUniqueBoundaryValue(); - ContentType cType = new ContentType("multipart", subtype, null); + /* + * Compute a boundary string. + String boundary = UniqueValue.getUniqueBoundaryValue(); + ContentType cType = new ContentType("multipart", subtype, null); contentType.setParameter("boundary", boundary); - */ + */ } /** @@ -144,25 +145,25 @@ * skips the 'preamble' and reads bytes till the terminating * boundary and creates MimeBodyParts for each part of the stream. * - * @param ds DataSource, can be a MultipartDataSource. - * @param ct content type. - * @exception MessagingException in case of error. + * @param ct content type. + * @param ds DataSource, can be a MultipartDataSource. + * @throws MessagingException in case of error. */ public BMMimeMultipart(DataSource ds, ContentType ct) - throws MessagingException { - super(ds,ct); + throws MessagingException { + super(ds, ct); boundary = ct.getParameter("boundary"); /* - if (ds instanceof MultipartDataSource) { - // ask super to do this for us. - setMultipartDataSource((MultipartDataSource)ds); - return; - } + if (ds instanceof MultipartDataSource) { + // ask super to do this for us. + setMultipartDataSource((MultipartDataSource)ds); + return; + } - // 'ds' was not a MultipartDataSource, we have - // to parse this ourself. - parsed = false; - this.ds = ds; + // 'ds' was not a MultipartDataSource, we have + // to parse this ourself. + parsed = false; + this.ds = ds; if (ct==null) contentType = new ContentType(ds.getContentType()); else @@ -177,8 +178,8 @@ try { in = ds.getInputStream(); if (!(in instanceof ByteArrayInputStream) && - !(in instanceof BufferedInputStream) && - !(in instanceof SharedInputStream)) + !(in instanceof BufferedInputStream) && + !(in instanceof SharedInputStream)) in = new BufferedInputStream(in); } catch (Exception ex) { throw new MessagingException("No inputstream from datasource"); @@ -186,7 +187,7 @@ if (!in.markSupported()) { throw new MessagingException( - "InputStream does not support Marking"); + "InputStream does not support Marking"); } } return in; @@ -199,10 +200,10 @@ * method is called by all other methods that need data for * the body parts, to make sure the data has been parsed. * - * @since JavaMail 1.2 + * @since JavaMail 1.2 */ @Override - protected void parse() throws MessagingException { + protected void parse() throws MessagingException { if (parsed) return; @@ -210,7 +211,7 @@ SharedInputStream sin = null; if (in instanceof SharedInputStream) { - sin = (SharedInputStream)in; + sin = (SharedInputStream) in; } String bnd = "--" + boundary; @@ -231,8 +232,8 @@ } public MimeBodyPart getNextPart( - InputStream stream, byte[] pattern, SharedInputStream sin) - throws Exception { + InputStream stream, byte[] pattern, SharedInputStream sin) + throws Exception { if (!stream.markSupported()) { throw new Exception("InputStream does not support Marking"); @@ -242,7 +243,7 @@ compile(pattern); if (!skipPreamble(stream, pattern, sin)) { throw new Exception( - "Missing Start Boundary, or boundary does not start on a new line"); + "Missing Start Boundary, or boundary does not start on a new line"); } begining = false; } @@ -256,7 +257,7 @@ b = readHeaders(stream); if (b == -1) { throw new Exception( - "End of Stream encountered while reading part headers"); + "End of Stream encountered while reading part headers"); } long[] v = new long[1]; v[0] = -1; // just to ensure the code later sets it correctly @@ -276,7 +277,7 @@ } else { InternetHeaders headers = createInternetHeaders(stream); ByteOutputStream baos = new ByteOutputStream(); - b = readBody(stream, pattern, null,baos, null); + b = readBody(stream, pattern, null, baos, null); // looks like this check has to be disabled // in the old impl it is allowed to have Mime Package // without closing boundary @@ -286,7 +287,7 @@ } } MimeBodyPart mbp = createMimeBodyPart( - headers, baos.getBytes(), baos.getCount()); + headers, baos.getBytes(), baos.getCount()); addBodyPart(mbp); return mbp; } @@ -294,11 +295,11 @@ } public boolean parse( - InputStream stream, byte[] pattern, SharedInputStream sin) - throws Exception { + InputStream stream, byte[] pattern, SharedInputStream sin) + throws Exception { while (!lastPartFound.get(0) && (b != -1)) { - getNextPart(stream, pattern, sin); + getNextPart(stream, pattern, sin); } return true; } @@ -307,7 +308,7 @@ // if the headers are to end properly then there has to be CRLF // actually we just need to mark the start and end positions int b = is.read(); - while(b != -1) { + while (b != -1) { // when it is a shared input stream no need to copy if (b == '\r') { b = is.read(); @@ -316,7 +317,7 @@ if (b == '\r') { b = is.read(); if (b == '\n') { - return b; + return b; } else { continue; } @@ -331,43 +332,43 @@ } if (b == -1) { throw new Exception( - "End of inputstream while reading Mime-Part Headers"); + "End of inputstream while reading Mime-Part Headers"); } return b; } private int readBody( - InputStream is, byte[] pattern, long[] posVector, - ByteOutputStream baos, SharedInputStream sin) - throws Exception { + InputStream is, byte[] pattern, long[] posVector, + ByteOutputStream baos, SharedInputStream sin) + throws Exception { if (!find(is, pattern, posVector, baos, sin)) { throw new Exception( - "Missing boundary delimitier while reading Body Part"); + "Missing boundary delimitier while reading Body Part"); } return b; } private boolean skipPreamble( - InputStream is, byte[] pattern, SharedInputStream sin) - throws Exception { + InputStream is, byte[] pattern, SharedInputStream sin) + throws Exception { if (!find(is, pattern, sin)) { return false; } if (lastPartFound.get(0)) { throw new Exception( - "Found closing boundary delimiter while trying to skip preamble"); + "Found closing boundary delimiter while trying to skip preamble"); } return true; } - public int readNext(InputStream is, byte[] buff, int patternLength, - BitSet eof, long[] posVector, SharedInputStream sin) - throws Exception { + public int readNext(InputStream is, byte[] buff, int patternLength, + BitSet eof, long[] posVector, SharedInputStream sin) + throws Exception { int bufferLength = is.read(buffer, 0, patternLength); if (bufferLength == -1) { - eof.flip(0); + eof.flip(0); } else if (bufferLength < patternLength) { //repeatedly read patternLength - bufferLength int temp = 0; @@ -385,18 +386,18 @@ } break; } - buffer[i] = (byte)temp; + buffer[i] = (byte) temp; } - bufferLength=i; + bufferLength = i; } return bufferLength; } public boolean find(InputStream is, byte[] pattern, SharedInputStream sin) - throws Exception { + throws Exception { int i; int l = pattern.length; - int lx = l -1; + int lx = l - 1; BitSet eof = new BitSet(1); long[] posVector = new long[1]; @@ -409,12 +410,12 @@ } /* - if (bufferLength < l) { - //is.reset(); - return false; - }*/ + if (bufferLength < l) { + //is.reset(); + return false; + }*/ - for(i = lx; i >= 0; i--) { + for (i = lx; i >= 0; i--) { if (buffer[i] != pattern[i]) { break; } @@ -435,11 +436,11 @@ } public boolean find( - InputStream is, byte[] pattern, long[] posVector, - ByteOutputStream out, SharedInputStream sin) throws Exception { + InputStream is, byte[] pattern, long[] posVector, + ByteOutputStream out, SharedInputStream sin) throws Exception { int i; int l = pattern.length; - int lx = l -1; + int lx = l - 1; int bufferLength = 0; int s = 0; long endPos = -1; @@ -466,7 +467,7 @@ // looks like it is allowed to not have a closing boundary //return false; //if (sin != null) { - // posVector[0] = endPos; + // posVector[0] = endPos; //} b = -1; if ((s == l) && (sin == null)) { @@ -482,7 +483,7 @@ } else { // looks like it is allowed to not have a closing boundary // in the old implementation - out.write(buffer, 0, bufferLength); + out.write(buffer, 0, bufferLength); } // looks like it is allowed to not have a closing boundary // in the old implementation @@ -491,7 +492,7 @@ return true; } - for(i = lx; i >= 0; i--) { + for (i = lx; i >= 0; i--) { if (buffer[i] != pattern[i]) { break; } @@ -507,7 +508,7 @@ if (s == 2) { if (prevBuffer[1] == '\n') { if (prevBuffer[0] != '\r' && prevBuffer[0] != '\n') { - out.write(prevBuffer,0,1); + out.write(prevBuffer, 0, 1); } if (sin != null) { posVector[0] = endPos; @@ -516,15 +517,15 @@ } else { throw new Exception( "Boundary characters encountered in part Body " + - "without a preceeding CRLF"); + "without a preceeding CRLF"); } - } else if (s==1) { + } else if (s == 1) { if (prevBuffer[0] != '\n') { throw new Exception( "Boundary characters encountered in part Body " + - "without a preceeding CRLF"); - }else { + "without a preceeding CRLF"); + } else { if (sin != null) { posVector[0] = endPos; } @@ -532,13 +533,13 @@ } } else if (s > 2) { - if ((prevBuffer[s-2] == '\r') && (prevBuffer[s-1] == '\n')) { + if ((prevBuffer[s - 2] == '\r') && (prevBuffer[s - 1] == '\n')) { if (sin != null) { posVector[0] = endPos - 2; } else { out.write(prevBuffer, 0, s - 2); } - } else if (prevBuffer[s-1] == '\n') { + } else if (prevBuffer[s - 1] == '\n') { //old impl allowed just a \n if (sin != null) { posVector[0] = endPos - 1; @@ -547,8 +548,8 @@ } } else { throw new Exception( - "Boundary characters encountered in part Body " + - "without a preceeding CRLF"); + "Boundary characters encountered in part Body " + + "without a preceeding CRLF"); } } } @@ -561,22 +562,22 @@ } if ((s > 0) && (sin == null)) { - if (prevBuffer[s-1] == (byte)13) { + if (prevBuffer[s - 1] == (byte) 13) { // if buffer[0] == (byte)10 - if (buffer[0] == (byte)10) { + if (buffer[0] == (byte) 10) { int j; - for(j = lx-1; j > 0; j--) { - if (buffer[j+1] != pattern[j]) { + for (j = lx - 1; j > 0; j--) { + if (buffer[j + 1] != pattern[j]) { break; - } - } - if (j == 0) { - // matched the pattern excluding the last char of the pattern - // so dont write the CR into stream - out.write(prevBuffer,0,s-1); - } else { - out.write(prevBuffer,0,s); - } + } + } + if (j == 0) { + // matched the pattern excluding the last char of the pattern + // so dont write the CR into stream + out.write(prevBuffer, 0, s - 1); + } else { + out.write(prevBuffer, 0, s); + } } else { out.write(prevBuffer, 0, s); } @@ -612,20 +613,20 @@ return true; } else { throw new Exception( - "transport padding after a Mime Boundary should end in a CRLF, found CR only"); + "transport padding after a Mime Boundary should end in a CRLF, found CR only"); } } if (b == '-') { b = is.read(); if (b != '-') { - throw new Exception( - "Unexpected singular '-' character after Mime Boundary"); + throw new Exception( + "Unexpected singular '-' character after Mime Boundary"); } else { //System.out.println("Last Part Found"); lastPartFound.flip(0); // read the next char - b = is.read(); + b = is.read(); } } @@ -641,7 +642,7 @@ b = is.read(); } if (b == '\n') { - return true; + return true; } } } @@ -673,7 +674,8 @@ // Initialise Good Suffix Shift table gss = new int[l]; - NEXT: for (i = l; i > 0; i--) { + NEXT: + for (i = l; i > 0; i--) { // j is the beginning index of suffix being considered for (j = l - 1; j >= i; j--) { // Testing for good suffix @@ -681,9 +683,9 @@ // pattern[j..len] is a good suffix gss[j - 1] = i; } else { - // No match. The array has already been - // filled up with correct values before. - continue NEXT; + // No match. The array has already been + // filled up with correct values before. + continue NEXT; } } while (j > 0) { @@ -756,6 +758,7 @@ this.contentType.setParameter("boundary", bnd); } } + public String getBoundary() { return this.boundary; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/InternetHeaders.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/InternetHeaders.java Mon Jul 10 15:54:38 2017 +0200 @@ -320,15 +320,15 @@ * @return list of header lines. */ public List<String> getAllHeaderLines() { - if(headerValueView==null) + if (headerValueView == null) headerValueView = new AbstractList<String>() { @Override - public String get(int index) { + public String get(int index) { return headers.get(index).line; } @Override - public int size() { + public int size() { return headers.size(); } };
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeMultipart.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeMultipart.java Mon Jul 10 15:54:38 2017 +0200 @@ -31,15 +31,21 @@ package com.sun.xml.internal.messaging.saaj.packaging.mime.internet; -import java.io.*; +import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException; +import com.sun.xml.internal.messaging.saaj.packaging.mime.MultipartDataSource; +import com.sun.xml.internal.messaging.saaj.packaging.mime.util.ASCIIUtility; +import com.sun.xml.internal.messaging.saaj.packaging.mime.util.LineInputStream; +import com.sun.xml.internal.messaging.saaj.packaging.mime.util.OutputUtil; +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; +import com.sun.xml.internal.messaging.saaj.util.FinalArrayList; +import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; import javax.activation.DataSource; - -import com.sun.xml.internal.messaging.saaj.packaging.mime.*; -import com.sun.xml.internal.messaging.saaj.packaging.mime.util.*; -import com.sun.xml.internal.messaging.saaj.util.FinalArrayList; -import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; -import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; /** * The MimeMultipart class is an implementation @@ -211,7 +217,7 @@ * @exception MessagingException if no such MimeBodyPart exists */ public MimeBodyPart getBodyPart(int index) - throws MessagingException { + throws MessagingException { parse(); if (parts == null) throw new IndexOutOfBoundsException("No such BodyPart"); @@ -228,19 +234,19 @@ * @exception MessagingException if no such MimeBodyPart exists. */ public MimeBodyPart getBodyPart(String CID) - throws MessagingException { + throws MessagingException { parse(); int count = getCount(); for (int i = 0; i < count; i++) { MimeBodyPart part = getBodyPart(i); String s = part.getContentID(); - // Old versions of AXIS2 put angle brackets around the content - // id but not the start param - String sNoAngle = (s!= null) ? s.replaceFirst("^<", "").replaceFirst(">$", "") - :null; + // Old versions of AXIS2 put angle brackets around the content + // id but not the start param + String sNoAngle = (s!= null) ? s.replaceFirst("^<", "").replaceFirst(">$", "") + :null; if (s != null && (s.equals(CID) || CID.equals(sNoAngle))) - return part; + return part; } return null; } @@ -319,14 +325,14 @@ try { in = ds.getInputStream(); if (!(in instanceof ByteArrayInputStream) && - !(in instanceof BufferedInputStream) && - !(in instanceof SharedInputStream)) + !(in instanceof BufferedInputStream) && + !(in instanceof SharedInputStream)) in = new BufferedInputStream(in); } catch (Exception ex) { throw new MessagingException("No inputstream from datasource"); } if (in instanceof SharedInputStream) - sin = (SharedInputStream)in; + sin = (SharedInputStream) in; String boundary = "--" + contentType.getParameter("boundary"); byte[] bndbytes = ASCIIUtility.getBytes(boundary); @@ -338,12 +344,12 @@ LineInputStream lin = new LineInputStream(in); String line; while ((line = lin.readLine()) != null) { - /* - * Strip trailing whitespace. Can't use trim method - * because it's too aggressive. Some bogus MIME - * messages will include control characters in the - * boundary string. - */ + /* + * Strip trailing whitespace. Can't use trim method + * because it's too aggressive. Some bogus MIME + * messages will include control characters in the + * boundary string. + */ int i; for (i = line.length() - 1; i >= 0; i--) { char c = line.charAt(i); @@ -357,12 +363,12 @@ if (line == null) throw new MessagingException("Missing start boundary"); - /* - * Read and process body parts until we see the - * terminating boundary line (or EOF). - */ + /* + * Read and process body parts until we see the + * terminating boundary line (or EOF). + */ boolean done = false; - getparts: + getparts: while (!done) { InternetHeaders headers = null; if (sin != null) { @@ -372,7 +378,7 @@ ; if (line == null) { if (!ignoreMissingEndBoundary) { - throw new MessagingException("Missing End Boundary for Mime Package : EOF while skipping headers"); + throw new MessagingException("Missing End Boundary for Mime Package : EOF while skipping headers"); } // assume there's just a missing end boundary break getparts; @@ -397,7 +403,7 @@ /* * Read and save the content bytes in buf. */ - for (;;) { + for (; ; ) { if (bol) { /* * At the beginning of a line, check whether the @@ -416,7 +422,7 @@ if (in.read() == '-') { done = true; foundClosingBoundary = true; - break; // ignore trailing text + break; // ignore trailing text } } // skip linear whitespace @@ -424,12 +430,12 @@ b2 = in.read(); // check for end of line if (b2 == '\n') - break; // got it! break out of the loop + break; // got it! break out of the loop if (b2 == '\r') { in.mark(1); if (in.read() != '\n') in.reset(); - break; // got it! break out of the loop + break; // got it! break out of the loop } } // failed to match, reset and proceed normally @@ -491,7 +497,7 @@ buf.close(); } - if (!ignoreMissingEndBoundary && !foundClosingBoundary && sin== null) { + if (!ignoreMissingEndBoundary && !foundClosingBoundary && sin == null) { throw new MessagingException("Missing End Boundary for Mime Package : EOF while skipping headers"); } parsed = true; @@ -510,7 +516,7 @@ * @since JavaMail 1.2 */ protected InternetHeaders createInternetHeaders(InputStream is) - throws MessagingException { + throws MessagingException { return new InternetHeaders(is); } @@ -523,12 +529,12 @@ * * @param headers the headers for the body part. * @param content the content of the body part. - * @param len the content length. + * @param len the content length. * @return MimeBodyPart * @since JavaMail 1.2 */ protected MimeBodyPart createMimeBodyPart(InternetHeaders headers, byte[] content, int len) { - return new MimeBodyPart(headers, content,len); + return new MimeBodyPart(headers, content,len); } /** @@ -544,7 +550,7 @@ * @since JavaMail 1.2 */ protected MimeBodyPart createMimeBodyPart(InputStream is) throws MessagingException { - return new MimeBodyPart(is); + return new MimeBodyPart(is); } /** @@ -564,7 +570,7 @@ * @exception MessagingException in case of error. */ protected void setMultipartDataSource(MultipartDataSource mp) - throws MessagingException { + throws MessagingException { contentType = new ContentType(mp.getContentType()); int count = mp.getCount(); @@ -582,7 +588,7 @@ * @see #contentType */ public ContentType getContentType() { - return contentType; + return contentType; } /**
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimePartDataSource.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimePartDataSource.java Mon Jul 10 15:54:38 2017 +0200 @@ -28,21 +28,21 @@ */ - package com.sun.xml.internal.messaging.saaj.packaging.mime.internet; -import java.io.*; -import java.net.UnknownServiceException; +import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException; import javax.activation.DataSource; - -import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.UnknownServiceException; /** * A utility class that implements a DataSource out of * a MimeBodyPart. This class is primarily meant for service providers. * - * @author John Mani + * @author John Mani */ public final class MimePartDataSource implements DataSource { @@ -68,13 +68,13 @@ * using the <code>getContentStream()</code> method and decodes * it using the <code>MimeUtility.decode()</code> method. * - * @return decoded input stream + * @return decoded input stream */ @Override public InputStream getInputStream() throws IOException { try { - InputStream is = part.getContentStream(); + InputStream is = part.getContentStream(); String encoding = part.getEncoding(); if (encoding != null) @@ -92,7 +92,7 @@ * This implementation throws the UnknownServiceException. */ @Override - public OutputStream getOutputStream() throws IOException { + public OutputStream getOutputStream() throws IOException { throw new UnknownServiceException(); } @@ -113,11 +113,11 @@ * This implementation just returns an empty string. */ @Override - public String getName() { + public String getName() { try { - return part.getFileName(); + return part.getFileName(); } catch (MessagingException mex) { - return ""; + return ""; } } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimePullMultipart.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimePullMultipart.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -113,6 +113,7 @@ parsed = true; } + @Override protected void parse() throws MessagingException { parseAll(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/ParameterList.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/ParameterList.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -50,7 +50,7 @@ * No-arg Constructor. */ public ParameterList() { - this.list = new HashMap<String, String>(); + this.list = new HashMap<>(); } private ParameterList(HashMap<String, String> m) { @@ -73,7 +73,7 @@ int type; String name; - list = new HashMap<String, String>(); + list = new HashMap<>(); while (true) { tk = h.next(); type = tk.getType(); @@ -171,6 +171,7 @@ * * @return String */ + @Override public String toString() { return toString(0); } @@ -232,6 +233,6 @@ } public ParameterList copy() { - return new ParameterList((HashMap)list.clone()); + return new ParameterList((HashMap<String, String>)list.clone()); } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/ASCIIUtility.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/ASCIIUtility.java Mon Jul 10 15:54:38 2017 +0200 @@ -32,12 +32,14 @@ import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; public class ASCIIUtility { // Private constructor so that this class is not instantiated - private ASCIIUtility() { } + private ASCIIUtility() { + } /** @@ -47,16 +49,14 @@ * * Based on java.lang.Integer.parseInt(). * - * @param b bytes to convert to integer. + * @param b bytes to convert to integer. * @param start start of the range. - * @param end end of the range (not including). + * @param end end of the range (not including). * @param radix radix. - * * @return integer. - * */ public static int parseInt(byte[] b, int start, int end, int radix) - throws NumberFormatException { + throws NumberFormatException { if (b == null) throw new NumberFormatException("null"); @@ -77,18 +77,18 @@ } multmin = limit / radix; if (i < end) { - digit = Character.digit((char)b[i++], radix); + digit = Character.digit((char) b[i++], radix); if (digit < 0) { throw new NumberFormatException( - "illegal number: " + toString(b, start, end) - ); + "illegal number: " + toString(b, start, end) + ); } else { result = -digit; } } while (i < end) { // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit((char)b[i++], radix); + digit = Character.digit((char) b[i++], radix); if (digit < 0) { throw new NumberFormatException("illegal number"); } @@ -120,56 +120,48 @@ * array into a String. The range extends from <code>start</code> * till, but not including <code>end</code>. * - * @param b bytes to convert to integer. + * @param b bytes to convert to integer. * @param start start of the range. - * @param end end of the range (not including). - * + * @param end end of the range (not including). * @return integer. - * */ public static String toString(byte[] b, int start, int end) { int size = end - start; char[] theChars = new char[size]; for (int i = 0, j = start; i < size; ) - theChars[i++] = (char)(b[j++]&0xff); + theChars[i++] = (char) (b[j++] & 0xff); return new String(theChars); } - /** - * Encodes specified String into a sequence of bytes using the platform's - * default charset, storing the result into a new byte array. - * - * @param s string to encode into byte array. - * - * @return byte array. - * - */ + /** + * Encodes specified String into a sequence of bytes using the platform's + * default charset, storing the result into a new byte array. + * + * @param s string to encode into byte array. + * @return byte array. + */ public static byte[] getBytes(String s) { - char [] chars= s.toCharArray(); + char[] chars = s.toCharArray(); int size = chars.length; byte[] bytes = new byte[size]; - for (int i = 0; i < size;) + for (int i = 0; i < size; ) bytes[i] = (byte) chars[i++]; return bytes; } /** - * Converts input stream to array. - * - * @param is stream to convert to array. - * - * @return byte array. - * - * @throws IOException if an I/O error occurs. + * Converts input stream to array. * - * @deprecated - * this is an expensive operation that require an additional - * buffer reallocation just to get the array of an exact size. - * Unless you absolutely need the exact size array, don't use this. - * Use {@link ByteOutputStream} and {@link ByteOutputStream#write(InputStream)}. + * @param is stream to convert to array. + * @return byte array. + * @throws IOException if an I/O error occurs. + * @deprecated this is an expensive operation that require an additional + * buffer reallocation just to get the array of an exact size. + * Unless you absolutely need the exact size array, don't use this. + * Use {@link ByteOutputStream} and {@link ByteOutputStream#write(InputStream)}. */ @Deprecated public static byte[] getBytes(InputStream is) throws IOException {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QDecoderStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QDecoderStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -63,6 +63,7 @@ * stream is reached. * @exception IOException if an I/O error occurs. */ + @Override public int read() throws IOException { int c = in.read();
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QPDecoderStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QPDecoderStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -67,6 +67,7 @@ * stream is reached. * @exception IOException if an I/O error occurs. */ + @Override public int read() throws IOException { if (spaces > 0) { // We have cached space characters, return one @@ -150,6 +151,7 @@ * the stream has been reached. * @exception IOException if an I/O error occurs. */ + @Override public int read(byte[] buf, int off, int len) throws IOException { int i, c; for (i = 0; i < len; i++) { @@ -167,6 +169,7 @@ * Tests if this input stream supports marks. Currently this class * does not support marks */ + @Override public boolean markSupported() { return false; } @@ -178,6 +181,7 @@ * this method just invokes the <code>available</code> method * of the original input stream. */ + @Override public int available() throws IOException { // This is bogus ! We don't really know how much // bytes are available *after* decoding
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QPEncoderStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/QPEncoderStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -81,6 +81,7 @@ * @param len the number of bytes to write. * @exception IOException if an I/O error occurs. */ + @Override public void write(byte[] b, int off, int len) throws IOException { for (int i = 0; i < len; i++) write(b[off + i]); @@ -91,6 +92,7 @@ * @param b the data to be written. * @exception IOException if an I/O error occurs. */ + @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } @@ -100,6 +102,7 @@ * @param c the <code>byte</code>. * @exception IOException if an I/O error occurs. */ + @Override public void write(int c) throws IOException { c = c & 0xff; // Turn off the MSB. if (gotSpace) { // previous character was <SPACE> @@ -139,6 +142,7 @@ * to be encoded out to the stream. * @exception IOException if an I/O error occurs. */ + @Override public void flush() throws IOException { out.flush(); } @@ -147,6 +151,7 @@ * Forces any buffered output bytes to be encoded out to the stream * and closes this output stream */ + @Override public void close() throws IOException { out.close(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/UUDecoderStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/util/UUDecoderStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -78,6 +78,7 @@ * @see java.io.FilterInputStream#in */ + @Override public int read() throws IOException { if (index >= bufsize) { readPrefix(); @@ -88,6 +89,7 @@ return buffer[index++] & 0xff; // return lower byte } + @Override public int read(byte[] buf, int off, int len) throws IOException { int i, c; for (i = 0; i < len; i++) { @@ -101,10 +103,12 @@ return i; } + @Override public boolean markSupported() { return false; } + @Override public int available() throws IOException { // This is only an estimate, since in.available() // might include CRLFs too ..
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -88,6 +88,7 @@ } } + @Override public int getSize() throws SOAPException { if (mimePart != null) { try { @@ -124,6 +125,7 @@ } } + @Override public void clearContent() { if (mimePart != null) { mimePart.close(); @@ -133,6 +135,7 @@ rawContent = null; } + @Override public Object getContent() throws SOAPException { try { if (mimePart != null) { @@ -153,6 +156,7 @@ } } + @Override public void setContent(Object object, String contentType) throws IllegalArgumentException { if (mimePart != null) { @@ -165,23 +169,28 @@ } + @Override public DataHandler getDataHandler() throws SOAPException { if (mimePart != null) { //return an inputstream return new DataHandler(new DataSource() { + @Override public InputStream getInputStream() throws IOException { return mimePart.read(); } + @Override public OutputStream getOutputStream() throws IOException { throw new UnsupportedOperationException("getOutputStream cannot be supported : You have enabled LazyAttachments Option"); } + @Override public String getContentType() { return mimePart.getContentType(); } + @Override public String getName() { return "MIMEPart Wrapper DataSource"; } @@ -197,6 +206,7 @@ return dataHandler; } + @Override public void setDataHandler(DataHandler dataHandler) throws IllegalArgumentException { if (mimePart != null) { @@ -216,35 +226,43 @@ setMimeHeader("Content-Type", dataHandler.getContentType()); } + @Override public void removeAllMimeHeaders() { headers.removeAllHeaders(); } + @Override public void removeMimeHeader(String header) { headers.removeHeader(header); } + @Override public String[] getMimeHeader(String name) { return headers.getHeader(name); } + @Override public void setMimeHeader(String name, String value) { headers.setHeader(name, value); } + @Override public void addMimeHeader(String name, String value) { headers.addHeader(name, value); } - public Iterator getAllMimeHeaders() { + @Override + public Iterator<MimeHeader> getAllMimeHeaders() { return headers.getAllHeaders(); } - public Iterator getMatchingMimeHeaders(String[] names) { + @Override + public Iterator<MimeHeader> getMatchingMimeHeaders(String[] names) { return headers.getMatchingHeaders(names); } - public Iterator getNonMatchingMimeHeaders(String[] names) { + @Override + public Iterator<MimeHeader> getNonMatchingMimeHeaders(String[] names) { return headers.getNonMatchingHeaders(names); } @@ -329,6 +347,7 @@ } } + @Override public void setBase64Content(InputStream content, String contentType) throws SOAPException { @@ -365,6 +384,7 @@ } } + @Override public InputStream getBase64Content() throws SOAPException { InputStream stream; if (mimePart != null) { @@ -425,6 +445,7 @@ } } + @Override public void setRawContent(InputStream content, String contentType) throws SOAPException { if (mimePart != null) { @@ -475,6 +496,7 @@ } } */ + @Override public void setRawContentBytes( byte[] content, int off, int len, String contentType) throws SOAPException { @@ -498,6 +520,7 @@ } } + @Override public InputStream getRawContent() throws SOAPException { if (mimePart != null) { return mimePart.read(); @@ -522,6 +545,7 @@ } } + @Override public byte[] getRawContentBytes() throws SOAPException { InputStream ret; if (mimePart != null) { @@ -556,12 +580,14 @@ } // attachments are equal if they are the same reference + @Override public boolean equals(Object o) { return (this == o); } // In JDK 8 we get a warning if we implement equals() but not hashCode(). // There is no intuitive value for this, the default one in Object is fine. + @Override public int hashCode() { return super.hashCode(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, 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 @@ -71,6 +71,7 @@ private static ClassLoader getContextClassLoader() { return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { + @Override public ClassLoader run() { ClassLoader cl = null; try {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageFactoryImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageFactoryImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -63,6 +63,7 @@ return oldListener; } + @Override public SOAPMessage createMessage() throws SOAPException { throw new UnsupportedOperationException(); } @@ -105,6 +106,7 @@ "Unable to parse content type: " + e.getMessage()); } } + @Override public SOAPMessage createMessage(MimeHeaders headers, InputStream in) throws SOAPException, IOException { String contentTypeString = MessageImpl.getContentType(headers);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -87,7 +87,7 @@ protected boolean saved = false; protected byte[] messageBytes; protected int messageByteCount; - protected HashMap properties = new HashMap(); + protected Map<String, Object> properties = new HashMap<>(); // used for lazy attachment initialization protected MimeMultipart multiPart = null; @@ -883,17 +883,17 @@ throw new RuntimeException(e); } if (attachments == null) - attachments = new FinalArrayList<AttachmentPart>(); + attachments = new FinalArrayList<>(); attachments.add(attachment); needsSave(); } - static private final Iterator nullIter = Collections.EMPTY_LIST.iterator(); + static private final Iterator<AttachmentPart> nullIter = Collections.<AttachmentPart>EMPTY_LIST.iterator(); @Override - public Iterator getAttachments() { + public Iterator<AttachmentPart> getAttachments() { try { initializeAllAttachments(); } catch (Exception e) { @@ -963,7 +963,7 @@ } @Override - public Iterator getAttachments(MimeHeaders headers) { + public Iterator<AttachmentPart> getAttachments(MimeHeaders headers) { try { initializeAllAttachments(); } catch (Exception e) {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SAAJMetaFactoryImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SAAJMetaFactoryImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -42,6 +42,7 @@ Logger.getLogger(LogDomainConstants.SOAP_DOMAIN, "com.sun.xml.internal.messaging.saaj.soap.LocalStrings"); + @Override protected MessageFactory newMessageFactory(String protocol) throws SOAPException { if (SOAPConstants.SOAP_1_1_PROTOCOL.equals(protocol)) { @@ -60,6 +61,7 @@ } } + @Override protected SOAPFactory newSOAPFactory(String protocol) throws SOAPException { if (SOAPConstants.SOAP_1_1_PROTOCOL.equals(protocol)) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPDocumentFragment.java Mon Jul 10 15:54:38 2017 +0200 @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.sun.xml.internal.messaging.saaj.soap; + +import com.sun.xml.internal.messaging.saaj.soap.impl.NodeListImpl; +import org.w3c.dom.*; + +/** + * SAAJ wrapper for {@link DocumentFragment} + * + * @author Yan GAO. + */ +public class SOAPDocumentFragment implements DocumentFragment { + + private SOAPDocumentImpl soapDocument; + private DocumentFragment documentFragment; + + public SOAPDocumentFragment(SOAPDocumentImpl ownerDoc) { + this.soapDocument = ownerDoc; + this.documentFragment = soapDocument.getDomDocument().createDocumentFragment(); + } + + public SOAPDocumentFragment() {} + + @Override + public boolean hasAttributes() { + return documentFragment.hasAttributes(); + } + + @Override + public boolean isSameNode(Node other) { + return documentFragment.isSameNode(getDomNode(other)); + } + + @Override + public String lookupNamespaceURI(String prefix) { + return documentFragment.lookupNamespaceURI(prefix); + } + + @Override + public Node getParentNode() { + return soapDocument.findIfPresent(documentFragment.getParentNode()); + } + + @Override + public Node getFirstChild() { + return soapDocument.findIfPresent(documentFragment.getFirstChild()); + } + + @Override + public Object getUserData(String key) { + return documentFragment.getUserData(key); + } + + @Override + public String getTextContent() throws DOMException { + return documentFragment.getTextContent(); + } + @Override + public short getNodeType() { + return documentFragment.getNodeType(); + } + + public Node getDomNode(Node node) { + return soapDocument.getDomNode(node); + } + + @Override + public Node appendChild(Node newChild) throws DOMException { + Node node = soapDocument.importNode(newChild, true); + return soapDocument.findIfPresent(documentFragment.appendChild(getDomNode(node))); + } + + @Override + public Node removeChild(Node oldChild) throws DOMException { + return soapDocument.findIfPresent(documentFragment.removeChild(getDomNode(oldChild))); + } + + @Override + public NamedNodeMap getAttributes() { + return documentFragment.getAttributes(); + } + + @Override + public short compareDocumentPosition(Node other) throws DOMException { + return documentFragment.compareDocumentPosition(getDomNode(other)); + } + @Override + public void setTextContent(String textContent) throws DOMException { + documentFragment.setTextContent(textContent); + } + @Override + public Node insertBefore(Node newChild, Node refChild) throws DOMException { + Node node = soapDocument.importNode(newChild, true); + return soapDocument.findIfPresent(documentFragment.insertBefore(getDomNode(node), getDomNode(refChild))); + } + @Override + public Object setUserData(String key, Object data, UserDataHandler handler) { + return documentFragment.setUserData(key, data, handler); + } + @Override + public boolean isDefaultNamespace(String namespaceURI) { + return documentFragment.isDefaultNamespace(namespaceURI); + } + + @Override + public Node getLastChild() { + return soapDocument.findIfPresent(documentFragment.getLastChild()); + } + + @Override + public void setPrefix(String prefix) throws DOMException { + documentFragment.setPrefix(prefix); + } + @Override + public String getNodeName() { + return documentFragment.getNodeName(); + } + + @Override + public void setNodeValue(String nodeValue) throws DOMException { + documentFragment.setNodeValue(nodeValue); + } + @Override + public Node replaceChild(Node newChild, Node oldChild) throws DOMException { + Node node = soapDocument.importNode(newChild, true); + return soapDocument.findIfPresent(documentFragment.replaceChild(getDomNode(node), getDomNode(oldChild))); + } + @Override + public String getLocalName() { + return documentFragment.getLocalName(); + } + + @Override + public void normalize() { + documentFragment.normalize(); + } + + @Override + public Node cloneNode(boolean deep) { + Node node= documentFragment.cloneNode(deep); + soapDocument.registerChildNodes(node, deep); + return soapDocument.findIfPresent(node); + } + + @Override + public boolean isSupported(String feature, String version) { + return documentFragment.isSupported(feature, version); + } + + @Override + public boolean isEqualNode(Node arg) { + return documentFragment.isEqualNode(getDomNode(arg)); + } + + @Override + public boolean hasChildNodes() { + return documentFragment.hasChildNodes(); + } + + @Override + public String lookupPrefix(String namespaceURI) { + return documentFragment.lookupPrefix(namespaceURI); + } + + @Override + public String getNodeValue() throws DOMException { + return documentFragment.getNodeValue(); + } + @Override + public Document getOwnerDocument() { + return documentFragment.getOwnerDocument(); + } + @Override + public Object getFeature(String feature, String version) { + return documentFragment.getFeature(feature, version); + } + + @Override + public Node getPreviousSibling() { + return soapDocument.findIfPresent(documentFragment.getPreviousSibling()); + } + + @Override + public NodeList getChildNodes() { + return new NodeListImpl(soapDocument, documentFragment.getChildNodes()); + } + + @Override + public String getBaseURI() { + return documentFragment.getBaseURI(); + } + + @Override + public Node getNextSibling() { + return soapDocument.findIfPresent(documentFragment.getNextSibling()); + } + + @Override + public String getPrefix() { + return documentFragment.getPrefix(); + } + + @Override + public String getNamespaceURI() { + return documentFragment.getNamespaceURI(); + } + public Document getSoapDocument() { + return soapDocument; + } +}
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPDocumentImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPDocumentImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -32,6 +32,8 @@ import com.sun.xml.internal.messaging.saaj.soap.impl.CDATAImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.ElementFactory; import com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl; +import com.sun.xml.internal.messaging.saaj.soap.impl.NamedNodeMapImpl; +import com.sun.xml.internal.messaging.saaj.soap.impl.NodeListImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.SOAPCommentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.SOAPTextImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; @@ -39,6 +41,7 @@ import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; +import org.w3c.dom.CharacterData; import org.w3c.dom.Comment; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMException; @@ -52,6 +55,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.ProcessingInstruction; +import org.w3c.dom.Text; import org.w3c.dom.UserDataHandler; import javax.xml.parsers.DocumentBuilder; @@ -59,13 +63,14 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; +import java.lang.reflect.Constructor; import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; import java.util.logging.Logger; public class SOAPDocumentImpl implements SOAPDocument, javax.xml.soap.Node, Document { + public static final String SAAJ_NODE = "javax.xml.soap.Node"; + private static final String XMLNS = "xmlns".intern(); protected static final Logger log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN, @@ -75,8 +80,6 @@ private Document document; - private Map<Node, javax.xml.soap.Node> domToSoap = new HashMap<>(); - public SOAPDocumentImpl(SOAPPartImpl enclosingDocument) { document = createDocument(); this.enclosingSOAPPart = enclosingDocument; @@ -105,6 +108,7 @@ // super(doctype, grammarAccess); // } + @Override public SOAPPartImpl getSOAPPart() { if (enclosingSOAPPart == null) { log.severe("SAAJ0541.soap.fragment.not.bound.to.part"); @@ -113,19 +117,23 @@ return enclosingSOAPPart; } + @Override public SOAPDocumentImpl getDocument() { return this; } + @Override public DocumentType getDoctype() { // SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?) return null; } + @Override public DOMImplementation getImplementation() { return document.getImplementation(); } + @Override public Element getDocumentElement() { // This had better be an Envelope! getSOAPPart().doGetDocumentElement(); @@ -136,6 +144,7 @@ return document.getDocumentElement(); } + @Override public Element createElement(String tagName) throws DOMException { return ElementFactory.createElement( this, @@ -144,22 +153,27 @@ null); } + @Override public DocumentFragment createDocumentFragment() { - return document.createDocumentFragment(); + return new SOAPDocumentFragment(this); } + @Override public org.w3c.dom.Text createTextNode(String data) { return new SOAPTextImpl(this, data); } + @Override public Comment createComment(String data) { return new SOAPCommentImpl(this, data); } + @Override public CDATASection createCDATASection(String data) throws DOMException { return new CDATAImpl(this, data); } + @Override public ProcessingInstruction createProcessingInstruction( String target, String data) @@ -168,6 +182,7 @@ throw new UnsupportedOperationException("Processing Instructions are not allowed in SOAP documents"); } + @Override public Attr createAttribute(String name) throws DOMException { boolean isQualifiedName = (name.indexOf(":") > 0); if (isQualifiedName) { @@ -184,24 +199,70 @@ return document.createAttribute(name); } + @Override public EntityReference createEntityReference(String name) throws DOMException { log.severe("SAAJ0543.soap.entity.refs.not.allowed.in.docs"); throw new UnsupportedOperationException("Entity References are not allowed in SOAP documents"); } + @Override public NodeList getElementsByTagName(String tagname) { - return document.getElementsByTagName(tagname); + return new NodeListImpl(this, document.getElementsByTagName(tagname)); } + @Override public org.w3c.dom.Node importNode(Node importedNode, boolean deep) throws DOMException { - final Node node = document.importNode(getDomNode(importedNode), deep); - return node instanceof Element ? - ElementFactory.createElement(this, (Element) node) - : node; + Node domNode = getDomNode(importedNode); + final Node newNode = document.importNode(domNode, deep); + + if (importedNode instanceof javax.xml.soap.Node) { + Node newSoapNode = createSoapNode(importedNode.getClass(), newNode); + newNode.setUserData(SAAJ_NODE, newSoapNode, null); + if (deep && importedNode.hasChildNodes()) { + NodeList childNodes = importedNode.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + registerChildNodes(childNodes.item(i), deep); + } + } + return newSoapNode; + } + + registerChildNodes(newNode, deep); + return findIfPresent(newNode); } + //If the parentNode is not registered to domToSoap, create soap wapper for parentNode and register it to domToSoap + //If deep = true, also register all children of parentNode to domToSoap map. + public void registerChildNodes(Node parentNode, boolean deep) { + if (parentNode.getUserData(SAAJ_NODE) == null) { + if (parentNode instanceof Element) { + ElementFactory.createElement(this, (Element) parentNode); + } else if (parentNode instanceof CharacterData) { + switch (parentNode.getNodeType()) { + case CDATA_SECTION_NODE: + new CDATAImpl(this, (CharacterData) parentNode); + break; + case COMMENT_NODE: + new SOAPCommentImpl(this, (CharacterData) parentNode); + break; + case TEXT_NODE: + new SOAPTextImpl(this, (CharacterData) parentNode); + break; + } + } + } + if (deep) { + NodeList nodeList = parentNode.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node nextChild = nodeList.item(i); + registerChildNodes(nextChild, true); + } + } + } + + @Override public Element createElementNS(String namespaceURI, String qualifiedName) throws DOMException { return ElementFactory.createElement( @@ -211,19 +272,22 @@ namespaceURI); } + @Override public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException { return document.createAttributeNS(namespaceURI, qualifiedName); } + @Override public NodeList getElementsByTagNameNS( String namespaceURI, String localName) { - return document.getElementsByTagNameNS(namespaceURI, localName); + return new NodeListImpl(this, document.getElementsByTagNameNS(namespaceURI, localName)); } + @Override public Element getElementById(String elementId) { - return document.getElementById(elementId); + return (Element) findIfPresent(document.getElementById(elementId)); } @Override @@ -293,7 +357,7 @@ @Override public Node renameNode(Node n, String namespaceURI, String qualifiedName) throws DOMException { - return document.renameNode(n, namespaceURI, qualifiedName); + return findIfPresent(document.renameNode(n, namespaceURI, qualifiedName)); } @Override @@ -318,37 +382,37 @@ @Override public Node getParentNode() { - return document.getParentNode(); + return findIfPresent(document.getParentNode()); } @Override public NodeList getChildNodes() { - return document.getChildNodes(); + return new NodeListImpl(this, document.getChildNodes()); } @Override public Node getFirstChild() { - return document.getFirstChild(); + return findIfPresent(document.getFirstChild()); } @Override public Node getLastChild() { - return document.getLastChild(); + return findIfPresent(document.getLastChild()); } @Override public Node getPreviousSibling() { - return document.getPreviousSibling(); + return findIfPresent(document.getPreviousSibling()); } @Override public Node getNextSibling() { - return document.getNextSibling(); + return findIfPresent(document.getNextSibling()); } @Override public NamedNodeMap getAttributes() { - return document.getAttributes(); + return new NamedNodeMapImpl(document.getAttributes(), this); } @Override @@ -383,7 +447,9 @@ @Override public Node cloneNode(boolean deep) { - return document.cloneNode(deep); + Node node = document.cloneNode(deep); + registerChildNodes(node, deep); + return findIfPresent(node); } @Override @@ -428,7 +494,7 @@ @Override public short compareDocumentPosition(Node other) throws DOMException { - return document.compareDocumentPosition(other); + return document.compareDocumentPosition(getDomNode(other)); } @Override @@ -443,7 +509,7 @@ @Override public boolean isSameNode(Node other) { - return document.isSameNode(other); + return document.isSameNode(getDomNode(other)); } @Override @@ -463,7 +529,7 @@ @Override public boolean isEqualNode(Node arg) { - return document.isEqualNode(arg); + return document.isEqualNode(getDomNode(arg)); } @Override @@ -496,11 +562,11 @@ */ public void register(javax.xml.soap.Node node) { final Node domElement = getDomNode(node); - if (domToSoap.containsKey(domElement)) { + if (domElement.getUserData(SAAJ_NODE) != null) { throw new IllegalStateException("Element " + domElement.getNodeName() + " is already registered"); } - domToSoap.put(domElement, node); + domElement.setUserData(SAAJ_NODE, node, null); } /** @@ -522,7 +588,7 @@ if (node instanceof javax.xml.soap.Node) { return (javax.xml.soap.Node) node; } - final javax.xml.soap.Node found = domToSoap.get(node); + final javax.xml.soap.Node found = (javax.xml.soap.Node) node.getUserData(SAAJ_NODE); if (found == null && required) { throw new IllegalArgumentException(MessageFormat.format("Cannot find SOAP wrapper for element {0}", node)); } @@ -562,6 +628,24 @@ return node; } + + private Node createSoapNode(Class nodeType, Node node) { + if (SOAPTextImpl.class.isAssignableFrom(nodeType)) { + return new SOAPTextImpl(this, (Text) node); + } else if (SOAPCommentImpl.class.isAssignableFrom(nodeType)) { + return new SOAPCommentImpl(this, (Comment) node); + } else if (CDATAImpl.class.isAssignableFrom(nodeType)) { + return new CDATAImpl(this, (CDATASection) node); + } + try { + Constructor<Node> constructor = nodeType.getConstructor(SOAPDocumentImpl.class, Element.class); + return constructor.newInstance(this, node); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + public Document getDomElement() { return document; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPFactoryImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPFactoryImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -49,6 +49,7 @@ protected abstract SOAPDocumentImpl createDocument(); + @Override public SOAPElement createElement(String tagName) throws SOAPException { if (tagName == null) { log.log( @@ -60,6 +61,7 @@ NameImpl.createFromTagName(tagName)); } + @Override public SOAPElement createElement(Name name) throws SOAPException { // @since SAAJ 1.3 // If the Name was null it would cause a NullPointerException in earlier release @@ -71,6 +73,7 @@ return ElementFactory.createElement(createDocument(), name); } + @Override public SOAPElement createElement(QName qname) throws SOAPException { if (qname == null) { log.log(Level.SEVERE,"SAAJ0567.soap.null.input", @@ -80,6 +83,7 @@ return ElementFactory.createElement(createDocument(),qname); } + @Override public SOAPElement createElement( String localName, String prefix, @@ -96,6 +100,7 @@ return ElementFactory.createElement(createDocument(), localName, prefix, uri); } + @Override public Name createName(String localName, String prefix, String uri) throws SOAPException { // @since SAAJ 1.3 @@ -110,6 +115,7 @@ return NameImpl.create(localName, prefix, uri); } + @Override public Name createName(String localName) throws SOAPException { // @since SAAJ 1.3 // if localName==null, earlier impl would create Name with localName=null @@ -125,6 +131,7 @@ // Note: the child elements might still be org.w3c.dom.Element's, but the // getChildElements will do the conversion to SOAPElement when called. + @Override public SOAPElement createElement(Element domElement) throws SOAPException { if (domElement == null) { return null; @@ -163,14 +170,17 @@ return copy; } + @Override public Detail createDetail() throws SOAPException { throw new UnsupportedOperationException(); } + @Override public SOAPFault createFault(String reasonText, QName faultCode) throws SOAPException { throw new UnsupportedOperationException(); } + @Override public SOAPFault createFault() throws SOAPException { throw new UnsupportedOperationException(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPIOException.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPIOException.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -64,6 +64,7 @@ soapException.fillInStackTrace(); } + @Override public Throwable fillInStackTrace() { if (soapException != null) { soapException.fillInStackTrace(); @@ -71,26 +72,32 @@ return this; } + @Override public String getLocalizedMessage() { return soapException.getLocalizedMessage(); } + @Override public String getMessage() { return soapException.getMessage(); } + @Override public void printStackTrace() { soapException.printStackTrace(); } + @Override public void printStackTrace(PrintStream s) { soapException.printStackTrace(s); } + @Override public void printStackTrace(PrintWriter s) { soapException.printStackTrace(s); } + @Override public String toString() { return soapException.toString(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPPartImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPPartImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -75,6 +75,7 @@ import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; +import javax.xml.soap.MimeHeader; /** * SOAPPartImpl is the first attachment. This contains the XML/SOAP document. @@ -136,6 +137,7 @@ return (message != null) ? message.isFastInfoset() : false; } + @Override public SOAPEnvelope getEnvelope() throws SOAPException { // If there is no SOAP envelope already created, then create @@ -185,38 +187,47 @@ } } + @Override public void removeAllMimeHeaders() { headers.removeAllHeaders(); } + @Override public void removeMimeHeader(String header) { headers.removeHeader(header); } + @Override public String[] getMimeHeader(String name) { return headers.getHeader(name); } + @Override public void setMimeHeader(String name, String value) { headers.setHeader(name, value); } + @Override public void addMimeHeader(String name, String value) { headers.addHeader(name, value); } - public Iterator getAllMimeHeaders() { + @Override + public Iterator<MimeHeader> getAllMimeHeaders() { return headers.getAllHeaders(); } - public Iterator getMatchingMimeHeaders(String[] names) { + @Override + public Iterator<MimeHeader> getMatchingMimeHeaders(String[] names) { return headers.getMatchingHeaders(names); } - public Iterator getNonMatchingMimeHeaders(String[] names) { + @Override + public Iterator<MimeHeader> getNonMatchingMimeHeaders(String[] names) { return headers.getNonMatchingHeaders(names); } + @Override public Source getContent() throws SOAPException { if (source != null) { InputStream bis = null; @@ -248,6 +259,7 @@ return ((Envelope) getEnvelope()).getContent(); } + @Override public void setContent(Source source) throws SOAPException { try { if (source instanceof StreamSource) { @@ -376,18 +388,22 @@ DataHandler getDataHandler() { DataSource ds = new DataSource() { + @Override public OutputStream getOutputStream() throws IOException { throw new IOException("Illegal Operation"); } + @Override public String getContentType() { return getContentTypeString(); } + @Override public String getName() { return getContentId(); } + @Override public InputStream getInputStream() throws IOException { return getContentAsStream(); } @@ -395,15 +411,18 @@ return new DataHandler(ds); } + @Override public SOAPDocumentImpl getDocument() { handleNewSource(); return document; } + @Override public SOAPPartImpl getSOAPPart() { return this; } + @Override public DocumentType getDoctype() { return document.getDoctype(); } @@ -412,10 +431,12 @@ // same way whether they are called from here or directly from the document. // If the document needs any help from this SOAPPart then // Make it use a call-back as in doGetDocumentElement() below + @Override public DOMImplementation getImplementation() { return document.getImplementation(); } + @Override public Element getDocumentElement() { // If there is no SOAP envelope already created, then create // one from a source if one exists. If there is a newer source @@ -435,26 +456,32 @@ } } + @Override public Element createElement(String tagName) throws DOMException { return document.createElement(tagName); } + @Override public DocumentFragment createDocumentFragment() { return document.createDocumentFragment(); } + @Override public org.w3c.dom.Text createTextNode(String data) { return document.createTextNode(data); } + @Override public Comment createComment(String data) { return document.createComment(data); } + @Override public CDATASection createCDATASection(String data) throws DOMException { return document.createCDATASection(data); } + @Override public ProcessingInstruction createProcessingInstruction( String target, String data) @@ -462,20 +489,24 @@ return document.createProcessingInstruction(target, data); } + @Override public Attr createAttribute(String name) throws DOMException { return document.createAttribute(name); } + @Override public EntityReference createEntityReference(String name) throws DOMException { return document.createEntityReference(name); } + @Override public NodeList getElementsByTagName(String tagname) { handleNewSource(); return document.getElementsByTagName(tagname); } + @Override public org.w3c.dom.Node importNode( org.w3c.dom.Node importedNode, boolean deep) @@ -484,16 +515,19 @@ return document.importNode(importedNode, deep); } + @Override public Element createElementNS(String namespaceURI, String qualifiedName) throws DOMException { return document.createElementNS(namespaceURI, qualifiedName); } + @Override public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException { return document.createAttributeNS(namespaceURI, qualifiedName); } + @Override public NodeList getElementsByTagNameNS( String namespaceURI, String localName) { @@ -501,16 +535,19 @@ return document.getElementsByTagNameNS(namespaceURI, localName); } + @Override public Element getElementById(String elementId) { handleNewSource(); return document.getElementById(elementId); } + @Override public org.w3c.dom.Node appendChild(org.w3c.dom.Node newChild) throws DOMException { handleNewSource(); return document.appendChild(newChild); } + @Override public org.w3c.dom.Node cloneNode(boolean deep) { handleNewSource(); return document.cloneNode(deep); @@ -525,75 +562,92 @@ return newSoapPart; } + @Override public NamedNodeMap getAttributes() { return document.getDomDocument().getAttributes(); } + @Override public NodeList getChildNodes() { handleNewSource(); return document.getChildNodes(); } + @Override public org.w3c.dom.Node getFirstChild() { handleNewSource(); return document.getFirstChild(); } + @Override public org.w3c.dom.Node getLastChild() { handleNewSource(); return document.getLastChild(); } + @Override public String getLocalName() { return document.getDomDocument().getLocalName(); } + @Override public String getNamespaceURI() { return document.getDomDocument().getNamespaceURI(); } + @Override public org.w3c.dom.Node getNextSibling() { handleNewSource(); return document.getNextSibling(); } + @Override public String getNodeName() { return document.getDomDocument().getNodeName(); } + @Override public short getNodeType() { return document.getDomDocument().getNodeType(); } + @Override public String getNodeValue() throws DOMException { return document.getNodeValue(); } + @Override public Document getOwnerDocument() { return document.getDomDocument().getOwnerDocument(); } + @Override public org.w3c.dom.Node getParentNode() { return document.getDomDocument().getParentNode(); } + @Override public String getPrefix() { return document.getDomDocument().getPrefix(); } + @Override public org.w3c.dom.Node getPreviousSibling() { return document.getDomDocument().getPreviousSibling(); } + @Override public boolean hasAttributes() { return document.getDomDocument().hasAttributes(); } + @Override public boolean hasChildNodes() { handleNewSource(); return document.hasChildNodes(); } + @Override public org.w3c.dom.Node insertBefore( org.w3c.dom.Node arg0, org.w3c.dom.Node arg1) @@ -602,21 +656,25 @@ return document.insertBefore(arg0, arg1); } + @Override public boolean isSupported(String arg0, String arg1) { return document.getDomDocument().isSupported(arg0, arg1); } + @Override public void normalize() { handleNewSource(); document.normalize(); } + @Override public org.w3c.dom.Node removeChild(org.w3c.dom.Node arg0) throws DOMException { handleNewSource(); return document.removeChild(arg0); } + @Override public org.w3c.dom.Node replaceChild( org.w3c.dom.Node arg0, org.w3c.dom.Node arg1) @@ -625,10 +683,12 @@ return document.replaceChild(arg0, arg1); } + @Override public void setNodeValue(String arg0) throws DOMException { document.setNodeValue(arg0); } + @Override public void setPrefix(String arg0) throws DOMException { document.setPrefix(arg0); } @@ -703,141 +763,173 @@ this.sourceCharsetEncoding = charset; } + @Override public org.w3c.dom.Node renameNode(org.w3c.dom.Node n, String namespaceURI, String qualifiedName) throws DOMException { handleNewSource(); return document.renameNode(n, namespaceURI, qualifiedName); } + @Override public void normalizeDocument() { document.normalizeDocument(); } + @Override public DOMConfiguration getDomConfig() { return document.getDomDocument().getDomConfig(); } + @Override public org.w3c.dom.Node adoptNode(org.w3c.dom.Node source) throws DOMException { handleNewSource(); return document.adoptNode(source); } + @Override public void setDocumentURI(String documentURI) { document.setDocumentURI(documentURI); } + @Override public String getDocumentURI() { return document.getDomDocument().getDocumentURI(); } + @Override public void setStrictErrorChecking(boolean strictErrorChecking) { document.setStrictErrorChecking(strictErrorChecking); } + @Override public String getInputEncoding() { return document.getDomDocument().getInputEncoding(); } + @Override public String getXmlEncoding() { return document.getDomDocument().getXmlEncoding(); } + @Override public boolean getXmlStandalone() { return document.getDomDocument().getXmlStandalone(); } + @Override public void setXmlStandalone(boolean xmlStandalone) throws DOMException { document.setXmlStandalone(xmlStandalone); } + @Override public String getXmlVersion() { return document.getDomDocument().getXmlVersion(); } + @Override public void setXmlVersion(String xmlVersion) throws DOMException { document.setXmlVersion(xmlVersion); } + @Override public boolean getStrictErrorChecking() { return document.getDomDocument().getStrictErrorChecking(); } // DOM L3 methods from org.w3c.dom.Node + @Override public String getBaseURI() { return document.getDomDocument().getBaseURI(); } + @Override public short compareDocumentPosition(org.w3c.dom.Node other) throws DOMException { return document.compareDocumentPosition(other); } + @Override public String getTextContent() throws DOMException { return document.getTextContent(); } + @Override public void setTextContent(String textContent) throws DOMException { document.setTextContent(textContent); } + @Override public boolean isSameNode(org.w3c.dom.Node other) { return document.isSameNode(other); } + @Override public String lookupPrefix(String namespaceURI) { return document.getDomDocument().lookupPrefix(namespaceURI); } + @Override public boolean isDefaultNamespace(String namespaceURI) { return document.isDefaultNamespace(namespaceURI); } + @Override public String lookupNamespaceURI(String prefix) { return document.lookupNamespaceURI(prefix); } + @Override public boolean isEqualNode(org.w3c.dom.Node arg) { return document.getDomDocument().isEqualNode(arg); } + @Override public Object getFeature(String feature, String version) { return document.getFeature(feature,version); } + @Override public Object setUserData(String key, Object data, UserDataHandler handler) { return document.setUserData(key, data, handler); } + @Override public Object getUserData(String key) { return document.getDomDocument().getUserData(key); } + @Override public void recycleNode() { // Nothing seems to be required to be done here } + @Override public String getValue() { return null; } + @Override public void setValue(String value) { log.severe("SAAJ0571.soappart.setValue.not.defined"); throw new IllegalStateException("Setting value of a soap part is not defined"); } + @Override public void setParentElement(SOAPElement parent) throws SOAPException { log.severe("SAAJ0570.soappart.parent.element.not.defined"); throw new SOAPExceptionImpl("The parent element of a soap part is not defined"); } + @Override public SOAPElement getParentElement() { return null; } + @Override public void detachNode() { // Nothing seems to be required to be done here }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/StaxLazySourceBridge.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/StaxLazySourceBridge.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -42,38 +42,39 @@ * @author shih-chang.chen@oracle.com */ public class StaxLazySourceBridge extends StaxBridge { - private LazyEnvelopeSource lazySource; + private LazyEnvelopeSource lazySource; - public StaxLazySourceBridge(LazyEnvelopeSource src, SOAPPartImpl soapPart) throws SOAPException { - super(soapPart); - lazySource = src; - final String soapEnvNS = soapPart.getSOAPNamespace(); - try { - breakpoint = new XMLStreamReaderToXMLStreamWriter.Breakpoint(src.readToBodyStarTag(), saajWriter) { - public boolean proceedAfterStartElement() { - if ("Body".equals(reader.getLocalName()) && soapEnvNS.equals(reader.getNamespaceURI()) ){ - return false; - } else - return true; - } - }; - } catch (XMLStreamException e) { - throw new SOAPException(e); + public StaxLazySourceBridge(LazyEnvelopeSource src, SOAPPartImpl soapPart) throws SOAPException { + super(soapPart); + lazySource = src; + final String soapEnvNS = soapPart.getSOAPNamespace(); + try { + breakpoint = new XMLStreamReaderToXMLStreamWriter.Breakpoint(src.readToBodyStarTag(), saajWriter) { + @Override + public boolean proceedAfterStartElement() { + if ("Body".equals(reader.getLocalName()) && soapEnvNS.equals(reader.getNamespaceURI()) ){ + return false; + } else + return true; } + }; + } catch (XMLStreamException e) { + throw new SOAPException(e); } + } - @Override + @Override public XMLStreamReader getPayloadReader() { return lazySource.readPayload(); // throw new UnsupportedOperationException(); } - @Override + @Override public QName getPayloadQName() { return lazySource.getPayloadQName(); } - @Override + @Override public String getPayloadAttributeValue(String attName) { if (lazySource.isPayloadStreamReader()) { XMLStreamReader reader = lazySource.readPayload(); @@ -84,7 +85,7 @@ return null; } - @Override + @Override public String getPayloadAttributeValue(QName attName) { if (lazySource.isPayloadStreamReader()) { XMLStreamReader reader = lazySource.readPayload(); @@ -95,12 +96,13 @@ return null; } - public void bridgePayload() throws XMLStreamException { - //Assuming out is at Body - writePayloadTo(saajWriter); - } + @Override + public void bridgePayload() throws XMLStreamException { + //Assuming out is at Body + writePayloadTo(saajWriter); + } - public void writePayloadTo(XMLStreamWriter writer) throws XMLStreamException { + public void writePayloadTo(XMLStreamWriter writer) throws XMLStreamException { lazySource.writePayloadTo(writer); } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/StaxReaderBridge.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/StaxReaderBridge.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -38,41 +38,46 @@ * @author shih-chang.chen@oracle.com */ public class StaxReaderBridge extends StaxBridge { - private XMLStreamReader in; + private XMLStreamReader in; - public StaxReaderBridge(XMLStreamReader reader, SOAPPartImpl soapPart) throws SOAPException { - super(soapPart); - in = reader; - final String soapEnvNS = soapPart.getSOAPNamespace(); - breakpoint = new XMLStreamReaderToXMLStreamWriter.Breakpoint(reader, saajWriter) { - boolean seenBody = false; - boolean stopedAtBody = false; - public boolean proceedBeforeStartElement() { - if (stopedAtBody) return true; - if (seenBody) { - stopedAtBody = true; - return false; - } - if ("Body".equals(reader.getLocalName()) && soapEnvNS.equals(reader.getNamespaceURI()) ){ - seenBody = true; - } - return true; + public StaxReaderBridge(XMLStreamReader reader, SOAPPartImpl soapPart) throws SOAPException { + super(soapPart); + in = reader; + final String soapEnvNS = soapPart.getSOAPNamespace(); + breakpoint = new XMLStreamReaderToXMLStreamWriter.Breakpoint(reader, saajWriter) { + boolean seenBody = false; + boolean stopedAtBody = false; + @Override + public boolean proceedBeforeStartElement() { + if (stopedAtBody) return true; + if (seenBody) { + stopedAtBody = true; + return false; } - }; - } + if ("Body".equals(reader.getLocalName()) && soapEnvNS.equals(reader.getNamespaceURI()) ){ + seenBody = true; + } + return true; + } + }; + } + @Override public XMLStreamReader getPayloadReader() { return in; } + @Override public QName getPayloadQName() { return (in.getEventType() == XMLStreamConstants.START_ELEMENT) ? in.getName() : null; } + @Override public String getPayloadAttributeValue(String attName) { return (in.getEventType() == XMLStreamConstants.START_ELEMENT) ? in.getAttributeValue(null, attName) : null; } + @Override public String getPayloadAttributeValue(QName attName) { return (in.getEventType() == XMLStreamConstants.START_ELEMENT) ? in.getAttributeValue(attName.getNamespaceURI(), attName.getLocalPart()) : null; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/dynamic/SOAPFactoryDynamicImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/dynamic/SOAPFactoryDynamicImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -36,10 +36,12 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPFactoryImpl; public class SOAPFactoryDynamicImpl extends SOAPFactoryImpl { + @Override protected SOAPDocumentImpl createDocument() { return null; } + @Override public Detail createDetail() throws SOAPException { throw new UnsupportedOperationException( "createDetail() not supported for Dynamic Protocol");
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/dynamic/SOAPMessageFactoryDynamicImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/dynamic/SOAPMessageFactoryDynamicImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -35,6 +35,7 @@ import com.sun.xml.internal.messaging.saaj.soap.MessageFactoryImpl; public class SOAPMessageFactoryDynamicImpl extends MessageFactoryImpl { + @Override public SOAPMessage createMessage() throws SOAPException { throw new UnsupportedOperationException( "createMessage() not supported for Dynamic Protocol");
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/BodyElementImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/BodyElementImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -29,6 +29,7 @@ import javax.xml.soap.*; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; +import org.w3c.dom.Element; /** * All elements of the SOAP-ENV:BODY. @@ -47,6 +48,11 @@ super(ownerDoc, qname); } + public BodyElementImpl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public void setParentElement(SOAPElement element) throws SOAPException { if (! (element instanceof SOAPBody)) { log.severe("SAAJ0101.impl.parent.of.body.elem.mustbe.body");
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/BodyImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/BodyImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -30,21 +30,30 @@ import java.util.logging.Level; import javax.xml.namespace.QName; -import javax.xml.soap.*; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; -import org.w3c.dom.*; -import org.w3c.dom.Node; import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.StaxBridge; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPBodyElement; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFault; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * The implementation of SOAP-ENV:BODY or the SOAPBody abstraction. @@ -72,6 +81,7 @@ protected abstract SOAPFault createFaultElement(); protected abstract QName getDefaultFaultCode(); + @Override public SOAPFault addFault() throws SOAPException { if (hasFault()) { log.severe("SAAJ0110.impl.fault.already.exists"); @@ -88,6 +98,7 @@ return fault; } + @Override public SOAPFault addFault( Name faultCode, String faultString, @@ -100,6 +111,7 @@ return fault; } + @Override public SOAPFault addFault( QName faultCode, String faultString, @@ -112,6 +124,7 @@ return fault; } + @Override public SOAPFault addFault(Name faultCode, String faultString) throws SOAPException { @@ -121,6 +134,7 @@ return fault; } + @Override public SOAPFault addFault(QName faultCode, String faultString) throws SOAPException { @@ -147,6 +161,7 @@ return null; } + @Override public boolean hasFault() { QName payloadQName = getPayloadQName(); return getFaultQName().equals(payloadQName); @@ -156,6 +171,7 @@ return new QName(getNamespaceURI(), "Fault"); } + @Override public SOAPFault getFault() { if (hasFault()) { if (fault == null) { @@ -167,6 +183,7 @@ return null; } + @Override public SOAPBodyElement addBodyElement(Name name) throws SOAPException { SOAPBodyElement newBodyElement = (SOAPBodyElement) ElementFactory.createNamedElement( @@ -181,6 +198,7 @@ return newBodyElement; } + @Override public SOAPBodyElement addBodyElement(QName qname) throws SOAPException { SOAPBodyElement newBodyElement = (SOAPBodyElement) ElementFactory.createNamedElement( @@ -195,6 +213,7 @@ return newBodyElement; } + @Override public void setParentElement(SOAPElement element) throws SOAPException { if (!(element instanceof SOAPEnvelope)) { @@ -204,10 +223,12 @@ super.setParentElement(element); } + @Override protected SOAPElement addElement(Name name) throws SOAPException { return addBodyElement(name); } + @Override protected SOAPElement addElement(QName name) throws SOAPException { return addBodyElement(name); } @@ -226,6 +247,7 @@ // return super.replaceChild(newElement, ref); // } + @Override public SOAPBodyElement addDocument(Document document) throws SOAPException { /* @@ -252,7 +274,7 @@ org.w3c.dom.Node replacingNode = ownerDoc.importNode(docFrag, true); // Adding replacingNode at the last of the children list of body addNode(replacingNode); - Iterator<Node> i = + Iterator<javax.xml.soap.Node> i = getChildElements(NameImpl.copyElementName(rootElement)); // Return the child element with the required name which is at the // end of the list @@ -263,6 +285,7 @@ //*/ } + @Override protected SOAPElement convertToSoapElement(Element element) { final Node soapNode = getSoapDocument().findIfPresent(element); if ((soapNode instanceof SOAPBodyElement) && @@ -278,6 +301,7 @@ } } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { log.log(Level.SEVERE, "SAAJ0146.impl.invalid.name.change.requested", @@ -288,9 +312,10 @@ + newName.getLocalPart()); } + @Override public Document extractContentAsDocument() throws SOAPException { - Iterator<Node> eachChild = getChildElements(); + Iterator<javax.xml.soap.Node> eachChild = getChildElements(); javax.xml.soap.Node firstBodyElement = null; while (eachChild.hasNext() &&
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/CDATAImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/CDATAImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -25,325 +25,61 @@ package com.sun.xml.internal.messaging.saaj.soap.impl; -import java.util.logging.Logger; - -import javax.xml.soap.SOAPElement; -import javax.xml.soap.SOAPException; - import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; -import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; -import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; import org.w3c.dom.CDATASection; +import org.w3c.dom.CharacterData; import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.w3c.dom.Text; -import org.w3c.dom.UserDataHandler; -public class CDATAImpl implements CDATASection, javax.xml.soap.Text { - - protected static final Logger log = - Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN, - "com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings"); +public class CDATAImpl extends TextImpl<CDATASection> implements CDATASection { static final String cdataUC = "<![CDATA["; static final String cdataLC = "<![cdata["; + public CDATAImpl(SOAPDocumentImpl ownerDoc, String text) { + super(ownerDoc, text); + } + + public CDATAImpl(SOAPDocumentImpl ownerDoc, CharacterData data) { + super(ownerDoc, data); + } + + @Override + protected CDATASection createN(SOAPDocumentImpl ownerDoc, String text) { + CDATASection c = ownerDoc.getDomDocument().createCDATASection(text); +// ownerDoc.register(this); + return c; + } + + @Override + protected CDATASection createN(SOAPDocumentImpl ownerDoc, CharacterData data) { + CDATASection c = (CDATASection) data; + return c; + } + @Override public Text splitText(int offset) throws DOMException { - return cdataSection.splitText(offset); + return getDomElement().splitText(offset); } @Override public boolean isElementContentWhitespace() { - return cdataSection.isElementContentWhitespace(); + return getDomElement().isElementContentWhitespace(); } @Override public String getWholeText() { - return cdataSection.getWholeText(); + return getDomElement().getWholeText(); } @Override public Text replaceWholeText(String content) throws DOMException { - return cdataSection.replaceWholeText(content); - } - - @Override - public String getData() throws DOMException { - return cdataSection.getData(); - } - - @Override - public void setData(String data) throws DOMException { - cdataSection.setData(data); - } - - @Override - public int getLength() { - return cdataSection.getLength(); - } - - @Override - public String substringData(int offset, int count) throws DOMException { - return cdataSection.substringData(offset, count); - } - - @Override - public void appendData(String arg) throws DOMException { - cdataSection.appendData(arg); - } - - @Override - public void insertData(int offset, String arg) throws DOMException { - cdataSection.insertData(offset, arg); - } - - @Override - public void deleteData(int offset, int count) throws DOMException { - cdataSection.deleteData(offset, count); - } - - @Override - public void replaceData(int offset, int count, String arg) throws DOMException { - cdataSection.replaceData(offset, count, arg); - } - - @Override - public String getNodeName() { - return cdataSection.getNodeName(); - } - - @Override - public String getNodeValue() throws DOMException { - return cdataSection.getNodeValue(); - } - - @Override - public void setNodeValue(String nodeValue) throws DOMException { - cdataSection.setNodeValue(nodeValue); - } - - @Override - public short getNodeType() { - return cdataSection.getNodeType(); - } - - @Override - public Node getParentNode() { - return cdataSection.getParentNode(); - } - - @Override - public NodeList getChildNodes() { - return cdataSection.getChildNodes(); - } - - @Override - public Node getFirstChild() { - return cdataSection.getFirstChild(); - } - - @Override - public Node getLastChild() { - return cdataSection.getLastChild(); - } - - @Override - public Node getPreviousSibling() { - return cdataSection.getPreviousSibling(); - } - - @Override - public Node getNextSibling() { - return cdataSection.getNextSibling(); - } - - @Override - public NamedNodeMap getAttributes() { - return cdataSection.getAttributes(); - } - - @Override - public Document getOwnerDocument() { - return cdataSection.getOwnerDocument(); - } - - @Override - public Node insertBefore(Node newChild, Node refChild) throws DOMException { - return cdataSection.insertBefore(newChild, refChild); - } - - @Override - public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - return cdataSection.replaceChild(newChild, oldChild); - } - - @Override - public Node removeChild(Node oldChild) throws DOMException { - return cdataSection.removeChild(oldChild); - } - - @Override - public Node appendChild(Node newChild) throws DOMException { - return cdataSection.appendChild(newChild); - } - - @Override - public boolean hasChildNodes() { - return cdataSection.hasChildNodes(); - } - - @Override - public Node cloneNode(boolean deep) { - return cdataSection.cloneNode(deep); + return getDomElement().replaceWholeText(content); } @Override - public void normalize() { - cdataSection.normalize(); - } - - @Override - public boolean isSupported(String feature, String version) { - return cdataSection.isSupported(feature, version); - } - - @Override - public String getNamespaceURI() { - return cdataSection.getNamespaceURI(); - } - - @Override - public String getPrefix() { - return cdataSection.getPrefix(); - } - - @Override - public void setPrefix(String prefix) throws DOMException { - cdataSection.setPrefix(prefix); - } - - @Override - public String getLocalName() { - return cdataSection.getLocalName(); - } - - @Override - public boolean hasAttributes() { - return cdataSection.hasAttributes(); - } - - @Override - public String getBaseURI() { - return cdataSection.getBaseURI(); - } - - @Override - public short compareDocumentPosition(Node other) throws DOMException { - return cdataSection.compareDocumentPosition(other); - } - - @Override - public String getTextContent() throws DOMException { - return cdataSection.getTextContent(); - } - - @Override - public void setTextContent(String textContent) throws DOMException { - cdataSection.setTextContent(textContent); - } - - @Override - public boolean isSameNode(Node other) { - return cdataSection.isSameNode(other); - } - - @Override - public String lookupPrefix(String namespaceURI) { - return cdataSection.lookupPrefix(namespaceURI); - } - - @Override - public boolean isDefaultNamespace(String namespaceURI) { - return cdataSection.isDefaultNamespace(namespaceURI); - } - - @Override - public String lookupNamespaceURI(String prefix) { - return cdataSection.lookupNamespaceURI(prefix); - } - - @Override - public boolean isEqualNode(Node arg) { - return cdataSection.isEqualNode(arg); - } - - @Override - public Object getFeature(String feature, String version) { - return cdataSection.getFeature(feature, version); - } - - @Override - public Object setUserData(String key, Object data, UserDataHandler handler) { - return cdataSection.setUserData(key, data, handler); - } - - @Override - public Object getUserData(String key) { - return cdataSection.getUserData(key); - } - - private CDATASection cdataSection; - - public CDATAImpl(SOAPDocumentImpl ownerDoc, String text) { - cdataSection = ownerDoc.getDomDocument().createCDATASection(text); - ownerDoc.register(this); - } - - public String getValue() { - String nodeValue = getNodeValue(); - return (nodeValue.equals("") ? null : nodeValue); - } - - public void setValue(String text) { - setNodeValue(text); - } - - public void setParentElement(SOAPElement parent) throws SOAPException { - if (parent == null) { - log.severe("SAAJ0145.impl.no.null.to.parent.elem"); - throw new SOAPException("Cannot pass NULL to setParentElement"); - } - ((ElementImpl) parent).addNode(this); - } - - public SOAPElement getParentElement() { - return (SOAPElement) getParentNode(); - } - - - public void detachNode() { - org.w3c.dom.Node parent = getParentNode(); - if (parent != null) { - parent.removeChild(this); - } - } - - public void recycleNode() { - detachNode(); - // TBD - // - add this to the factory so subsequent - // creations can reuse this object. - } - public boolean isComment() { return false; } - public CDATASection getDomElement() { - return cdataSection; - } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailEntryImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailEntryImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -30,6 +30,7 @@ import javax.xml.soap.Name; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; +import org.w3c.dom.Element; public abstract class DetailEntryImpl extends ElementImpl @@ -40,4 +41,8 @@ public DetailEntryImpl(SOAPDocumentImpl ownerDoc, QName qname) { super(ownerDoc, qname); } + + public DetailEntryImpl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -31,7 +31,6 @@ import javax.xml.namespace.QName; import javax.xml.soap.*; -import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; import org.w3c.dom.Element; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; @@ -49,26 +48,31 @@ protected abstract DetailEntry createDetailEntry(Name name); protected abstract DetailEntry createDetailEntry(QName name); + @Override public DetailEntry addDetailEntry(Name name) throws SOAPException { DetailEntry entry = createDetailEntry(name); addNode(entry); return entry; } + @Override public DetailEntry addDetailEntry(QName qname) throws SOAPException { DetailEntry entry = createDetailEntry(qname); addNode(entry); return entry; } + @Override protected SOAPElement addElement(Name name) throws SOAPException { return addDetailEntry(name); } + @Override protected SOAPElement addElement(QName name) throws SOAPException { return addDetailEntry(name); } + @Override protected SOAPElement convertToSoapElement(Element element) { final javax.xml.soap.Node soapNode = getSoapDocument().find(element); if (soapNode instanceof DetailEntry) { @@ -82,12 +86,14 @@ } } - public Iterator getDetailEntries() { - return new Iterator<SOAPElement>() { + @Override + public Iterator<DetailEntry> getDetailEntries() { + return new Iterator<DetailEntry>() { Iterator<org.w3c.dom.Node> eachNode = getChildElementNodes(); SOAPElement next = null; SOAPElement last = null; + @Override public boolean hasNext() { if (next == null) { while (eachNode.hasNext()) { @@ -101,15 +107,17 @@ return next != null; } - public SOAPElement next() { + @Override + public DetailEntry next() { if (!hasNext()) { throw new NoSuchElementException(); } last = next; next = null; - return last; + return (DetailEntry) last; } + @Override public void remove() { if (last == null) { throw new IllegalStateException(); @@ -121,6 +129,7 @@ }; } + @Override protected boolean isStandardFaultElement() { return true; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementFactory.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementFactory.java Mon Jul 10 15:54:38 2017 +0200 @@ -106,9 +106,9 @@ } if ("Fault".equalsIgnoreCase(localName)) { if (NameImpl.SOAP11_NAMESPACE.equals(namespaceUri)) { - return new Fault1_1Impl(element, ownerDocument); + return new Fault1_1Impl(ownerDocument, element); } else if (NameImpl.SOAP12_NAMESPACE.equals(namespaceUri)) { - return new Fault1_2Impl(element, ownerDocument); + return new Fault1_2Impl(ownerDocument, element); } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -27,21 +27,37 @@ import java.net.URI; import java.net.URISyntaxException; -import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.namespace.QName; -import javax.xml.soap.*; -import org.w3c.dom.*; import org.w3c.dom.Node; import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; -import com.sun.xml.internal.messaging.saaj.util.*; +import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import com.sun.xml.internal.messaging.saaj.util.NamespaceContextIterator; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.NoSuchElementException; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPBodyElement; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; +import org.w3c.dom.Attr; +import org.w3c.dom.CharacterData; +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.NodeList; +import org.w3c.dom.TypeInfo; +import org.w3c.dom.UserDataHandler; public class ElementImpl implements SOAPElement, SOAPBodyElement { @@ -108,7 +124,7 @@ @Override public NodeList getElementsByTagName(String name) { - return new NodeListImpl(getSoapDocument(), element.getElementsByTagName(name)); + return new NodeListImpl(soapDocument, element.getElementsByTagName(name)); } @Override @@ -139,21 +155,21 @@ this.soapDocument = ownerDoc; this.element = ownerDoc.getDomDocument().createElementNS(name.getURI(), name.getQualifiedName()); elementQName = NameImpl.convertToQName(name); - getSoapDocument().register(this); + soapDocument.register(this); } public ElementImpl(SOAPDocumentImpl ownerDoc, QName name) { this.soapDocument = ownerDoc; this.element = ownerDoc.getDomDocument().createElementNS(name.getNamespaceURI(), getQualifiedName(name)); elementQName = name; - getSoapDocument().register(this); + soapDocument.register(this); } public ElementImpl(SOAPDocumentImpl ownerDoc, Element domElement) { this.element = domElement; this.soapDocument = ownerDoc; this.elementQName = new QName(domElement.getNamespaceURI(), domElement.getLocalName()); - getSoapDocument().register(this); + soapDocument.register(this); } public ElementImpl( @@ -165,7 +181,7 @@ this.element = ownerDoc.getDomDocument().createElementNS(uri, qualifiedName); elementQName = new QName(uri, getLocalPart(qualifiedName), getPrefix(qualifiedName)); - getSoapDocument().register(this); + soapDocument.register(this); } public void ensureNamespaceIsDeclared(String prefix, String uri) { @@ -178,28 +194,29 @@ } } + @Override public Document getOwnerDocument() { return soapDocument; } @Override public Node insertBefore(Node newChild, Node refChild) throws DOMException { - return element.insertBefore(getSoapDocument().getDomNode(newChild), getSoapDocument().getDomNode(refChild)); + return soapDocument.findIfPresent(element.insertBefore(soapDocument.getDomNode(newChild), soapDocument.getDomNode(refChild))); } @Override public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - return element.replaceChild(getSoapDocument().getDomNode(newChild), getSoapDocument().getDomNode(oldChild)); + return soapDocument.findIfPresent(element.replaceChild(soapDocument.getDomNode(newChild), soapDocument.getDomNode(oldChild))); } @Override public Node removeChild(Node oldChild) throws DOMException { - return element.removeChild(getSoapDocument().getDomNode(oldChild)); + return soapDocument.findIfPresent(element.removeChild(soapDocument.getDomNode(oldChild))); } @Override public Node appendChild(Node newChild) throws DOMException { - return element.appendChild(getSoapDocument().getDomNode(newChild)); + return soapDocument.findIfPresent(element.appendChild(soapDocument.getDomNode(newChild))); } @Override @@ -209,7 +226,9 @@ @Override public Node cloneNode(boolean deep) { - return element.cloneNode(deep); + Node elementNSNode = element.cloneNode(deep); + soapDocument.registerChildNodes(elementNSNode, deep); + return soapDocument.findIfPresent(soapDocument.getDomNode(elementNSNode)); } @Override @@ -254,7 +273,7 @@ @Override public short compareDocumentPosition(Node other) throws DOMException { - return element.compareDocumentPosition(other); + return element.compareDocumentPosition(soapDocument.getDomNode(other)); } @Override @@ -269,7 +288,7 @@ @Override public boolean isSameNode(Node other) { - return element.isSameNode(other); + return element.isSameNode(soapDocument.getDomNode(other)); } @Override @@ -289,7 +308,7 @@ @Override public boolean isEqualNode(Node arg) { - return element.isEqualNode(arg); + return element.isEqualNode(soapDocument.getDomNode(arg)); } @Override @@ -307,14 +326,17 @@ return element.getUserData(key); } + @Override public SOAPElement addChildElement(Name name) throws SOAPException { return addElement(name); } + @Override public SOAPElement addChildElement(QName qname) throws SOAPException { return addElement(qname); } + @Override public SOAPElement addChildElement(String localName) throws SOAPException { String nsUri = getNamespaceURI(""); Name name = (nsUri == null || nsUri.isEmpty()) @@ -323,6 +345,7 @@ return addChildElement(name); } + @Override public SOAPElement addChildElement(String localName, String prefix) throws SOAPException { String uri = getNamespaceURI(prefix); @@ -337,6 +360,7 @@ return addChildElement(localName, prefix, uri); } + @Override public String getNamespaceURI(String prefix) { if ("xmlns".equals(prefix)) { @@ -415,12 +439,14 @@ return null; } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { ElementImpl copy = new ElementImpl((SOAPDocumentImpl) getOwnerDocument(), newName); return replaceElementWithSOAPElement(this,copy); } + @Override public QName createQName(String localName, String prefix) throws SOAPException { String uri = getNamespaceURI(prefix); @@ -485,6 +511,7 @@ return new NamespaceContextIterator(this, traverseStack); } + @Override public SOAPElement addChildElement( String localName, String prefix, @@ -496,6 +523,7 @@ return convertToSoapElement(newElement); } + @Override public SOAPElement addChildElement(SOAPElement element) throws SOAPException { @@ -531,7 +559,7 @@ log.severe("SAAJ0158.impl.version.mismatch.fault"); throw new SOAPExceptionImpl("SOAP Version mismatch encountered when trying to add SOAPFault to SOAPBody"); } - Iterator<Node> it = this.getChildElements(); + Iterator<javax.xml.soap.Node> it = this.getChildElements(); if (it.hasNext()) { log.severe("SAAJ0156.impl.adding.fault.error"); throw new SOAPExceptionImpl("Cannot add SOAPFault as a child of a non-Empty SOAPBody"); @@ -542,8 +570,7 @@ // preserve the encodingStyle attr as it may get lost in the import String encodingStyle = element.getEncodingStyle(); - final Element domElement = ((ElementImpl) element).getDomElement(); - final Element importedElement = importElement(domElement); + final Element importedElement = importElement(element); addNode(importedElement); final SOAPElement converted = convertToSoapElement(importedElement); @@ -603,7 +630,7 @@ } protected void addNode(org.w3c.dom.Node newElement) throws SOAPException { - insertBefore(getSoapDocument().getDomNode(newElement), null); + insertBefore(soapDocument.getDomNode(newElement), null); if (getOwnerDocument() instanceof DocumentFragment) return; @@ -623,7 +650,7 @@ Node child = getFirstChild(); while (child != null) { if (child instanceof Element) { - return (Element) getSoapDocument().find(child); + return (Element) soapDocument.find(child); } child = child.getNextSibling(); } @@ -634,7 +661,7 @@ Node eachChild = getFirstChild(); while (eachChild != null) { if (eachChild instanceof Element) { - SOAPElement eachChildSoap = (SOAPElement) getSoapDocument().find(eachChild); + SOAPElement eachChildSoap = (SOAPElement) soapDocument.find(eachChild); if (eachChildSoap != null) { if (eachChildSoap.getElementName().equals(name)) { return eachChildSoap; @@ -658,6 +685,7 @@ return null; } + @Override public SOAPElement addTextNode(String text) throws SOAPException { if (text.startsWith(CDATAImpl.cdataUC) || text.startsWith(CDATAImpl.cdataLC)) @@ -680,6 +708,7 @@ return this; } + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { addAttributeBare(name, value); @@ -689,6 +718,7 @@ return this; } + @Override public SOAPElement addAttribute(QName qname, String value) throws SOAPException { addAttributeBare(qname, value); @@ -731,6 +761,7 @@ } } + @Override public SOAPElement addNamespaceDeclaration(String prefix, String uri) throws SOAPException { if (prefix.length() > 0) { @@ -743,10 +774,12 @@ return this; } + @Override public String getAttributeValue(Name name) { return getAttributeValueFrom(this, name); } + @Override public String getAttributeValue(QName qname) { return getAttributeValueFrom( this, @@ -756,9 +789,10 @@ getQualifiedName(qname)); } - public Iterator getAllAttributes() { + @Override + public Iterator<Name> getAllAttributes() { Iterator<Name> i = getAllAttributesFrom(this); - ArrayList<Name> list = new ArrayList<Name>(); + ArrayList<Name> list = new ArrayList<>(); while (i.hasNext()) { Name name = i.next(); if (!"xmlns".equalsIgnoreCase(name.getPrefix())) @@ -767,9 +801,10 @@ return list.iterator(); } - public Iterator getAllAttributesAsQNames() { + @Override + public Iterator<QName> getAllAttributesAsQNames() { Iterator<Name> i = getAllAttributesFrom(this); - ArrayList<QName> list = new ArrayList<QName>(); + ArrayList<QName> list = new ArrayList<>(); while (i.hasNext()) { Name name = i.next(); if (!"xmlns".equalsIgnoreCase(name.getPrefix())) { @@ -780,11 +815,13 @@ } - public Iterator getNamespacePrefixes() { + @Override + public Iterator<String> getNamespacePrefixes() { return doGetNamespacePrefixes(false); } - public Iterator getVisibleNamespacePrefixes() { + @Override + public Iterator<String> getVisibleNamespacePrefixes() { return doGetNamespacePrefixes(true); } @@ -805,11 +842,13 @@ } } + @Override public boolean hasNext() { findNext(); return next != null; } + @Override public String next() { findNext(); if (next == null) { @@ -821,6 +860,7 @@ return last; } + @Override public void remove() { if (last == null) { throw new IllegalStateException(); @@ -832,18 +872,22 @@ }; } + @Override public Name getElementName() { return NameImpl.convertToName(elementQName); } + @Override public QName getElementQName() { return elementQName; } + @Override public boolean removeAttribute(Name name) { return removeAttribute(name.getURI(), name.getLocalName()); } + @Override public boolean removeAttribute(QName name) { return removeAttribute(name.getNamespaceURI(), name.getLocalPart()); } @@ -860,6 +904,7 @@ return true; } + @Override public boolean removeNamespaceDeclaration(String prefix) { org.w3c.dom.Attr declaration = getNamespaceAttr(prefix); if (declaration == null) { @@ -873,12 +918,13 @@ return true; } - public Iterator<Node> getChildElements() { + @Override + public Iterator<javax.xml.soap.Node> getChildElements() { return getChildElementsFrom(this); } protected SOAPElement convertToSoapElement(Element element) { - final Node soapNode = getSoapDocument().findIfPresent(element); + final Node soapNode = soapDocument.findIfPresent(element); if (soapNode instanceof SOAPElement) { return (SOAPElement) soapNode; } else { @@ -888,6 +934,36 @@ } } + protected TextImpl convertToSoapText(CharacterData characterData) { + final Node soapNode = getSoapDocument().findIfPresent(characterData); + if (soapNode instanceof TextImpl) { + return (TextImpl) soapNode; + } else { + TextImpl t = null; + switch (characterData.getNodeType()) { + case CDATA_SECTION_NODE: + t = new CDATAImpl(getSoapDocument(), characterData.getData()); + break; + case COMMENT_NODE: + t = new SOAPCommentImpl(getSoapDocument(), characterData.getData()); + break; + case TEXT_NODE: + t = new SOAPTextImpl(getSoapDocument(), characterData.getData()); + break; + } + Node parent = getSoapDocument().find(characterData.getParentNode()); + if (parent != null) { + parent.replaceChild(t, characterData); + } // XXX else throw an exception? + + return t; + +// return replaceElementWithSOAPElement( +// element, +// (ElementImpl) createElement(NameImpl.copyElementName(element))); + } + } + protected SOAPElement replaceElementWithSOAPElement( Element element, ElementImpl copy) { @@ -898,13 +974,13 @@ copy.addAttributeBare(name, getAttributeValueFrom(element, name)); } - Iterator<Node> eachChild = getChildElementsFrom(element); + Iterator<Node> eachChild = getChildElementsFromDOM(element); while (eachChild.hasNext()) { Node nextChild = eachChild.next(); copy.insertBefore(nextChild, null); } - Node parent = getSoapDocument().find(element.getParentNode()); + Node parent = soapDocument.find(element.getParentNode()); if (parent != null) { parent.replaceChild(copy, element); } // XXX else throw an exception? @@ -912,18 +988,71 @@ return copy; } + private Iterator<Node> getChildElementsFromDOM(final Element el) { + return new Iterator<Node>() { + Node next = el.getFirstChild(); + Node nextNext = null; + Node last = null; + Node soapElement = getSoapDocument().findIfPresent(el); + + @Override + public boolean hasNext() { + if (next != null) { + return true; + } + if (nextNext != null) { + next = nextNext; + } + + return next != null; + } + + public Node next() { + if (hasNext()) { + last = next; + next = null; + + if ((soapElement instanceof ElementImpl) + && (last instanceof Element)) { + last = + ((ElementImpl) soapElement).convertToSoapElement( + (Element) last); + } else if ((soapElement instanceof ElementImpl) && (last instanceof CharacterData)) { + last = ((ElementImpl) soapElement).convertToSoapText( + (CharacterData) last); + } + + nextNext = last.getNextSibling(); + return last; + } + throw new NoSuchElementException(); + } + + @Override + public void remove() { + if (last == null) { + throw new IllegalStateException(); + } + Node target = last; + last = null; + el.removeChild(target); + } + }; + } + protected Iterator<Node> getChildElementNodes() { return new Iterator<Node>() { - Iterator<Node> eachNode = getChildElements(); + Iterator<javax.xml.soap.Node> eachNode = getChildElements(); Node next = null; Node last = null; + @Override public boolean hasNext() { if (next == null) { while (eachNode.hasNext()) { Node node = eachNode.next(); if (node instanceof Element) { - next = getSoapDocument().findIfPresent(node); + next = soapDocument.findIfPresent(node); break; } } @@ -931,15 +1060,17 @@ return next != null; } - public Node next() { + @Override + public javax.xml.soap.Node next() { if (hasNext()) { last = next; next = null; - return last; + return (javax.xml.soap.Node) last; } throw new NoSuchElementException(); } + @Override public void remove() { if (last == null) { throw new IllegalStateException(); @@ -951,20 +1082,23 @@ }; } - public Iterator getChildElements(final Name name) { + @Override + public Iterator<javax.xml.soap.Node> getChildElements(final Name name) { return getChildElements(name.getURI(), name.getLocalName()); } - public Iterator getChildElements(final QName qname) { + @Override + public Iterator<javax.xml.soap.Node> getChildElements(final QName qname) { return getChildElements(qname.getNamespaceURI(), qname.getLocalPart()); } - private Iterator<Node> getChildElements(final String nameUri, final String nameLocal) { - return new Iterator<Node>() { + private Iterator<javax.xml.soap.Node> getChildElements(final String nameUri, final String nameLocal) { + return new Iterator<javax.xml.soap.Node>() { Iterator<Node> eachElement = getChildElementNodes(); Node next = null; Node last = null; + @Override public boolean hasNext() { if (next == null) { while (eachElement.hasNext()) { @@ -982,15 +1116,17 @@ return next != null; } - public Node next() { + @Override + public javax.xml.soap.Node next() { if (!hasNext()) { throw new NoSuchElementException(); } last = next; next = null; - return last; + return (javax.xml.soap.Node) last; } + @Override public void remove() { if (last == null) { throw new IllegalStateException(); @@ -1002,6 +1138,7 @@ }; } + @Override public void removeContents() { Node currentChild = getFirstChild(); @@ -1020,6 +1157,7 @@ } } + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { if (!"".equals(encodingStyle)) { try { @@ -1037,6 +1175,7 @@ tryToFindEncodingStyleAttributeName(); } + @Override public String getEncodingStyle() { String encodingStyle = encodingStyleAttribute.getValue(); if (encodingStyle != null) @@ -1058,11 +1197,13 @@ } // Node methods + @Override public String getValue() { javax.xml.soap.Node valueNode = getValueNode(); return valueNode == null ? null : valueNode.getValue(); } + @Override public void setValue(String value) { Node valueNode = getValueNodeStrict(); if (valueNode != null) { @@ -1092,7 +1233,7 @@ } protected javax.xml.soap.Node getValueNode() { - Iterator<Node> i = getChildElements(); + Iterator<javax.xml.soap.Node> i = getChildElements(); while (i.hasNext()) { Node n = i.next(); if (n.getNodeType() == org.w3c.dom.Node.TEXT_NODE || @@ -1101,12 +1242,13 @@ normalize(); // Should remove the normalization step when this gets fixed in // DOM/Xerces. - return getSoapDocument().find(n); + return soapDocument.find(n); } } return null; } + @Override public void setParentElement(SOAPElement element) throws SOAPException { if (element == null) { log.severe("SAAJ0106.impl.no.null.to.parent.elem"); @@ -1138,12 +1280,13 @@ encodingStyleAttribute.setName(encodingStyleAttributeName); } + @Override public SOAPElement getParentElement() { Node parentNode = getParentNode(); if (parentNode instanceof SOAPDocument) { return null; } - return (SOAPElement) getSoapDocument().find(parentNode); + return (SOAPElement) soapDocument.find(parentNode); } protected String getSOAPNamespace() { @@ -1167,6 +1310,7 @@ return soapNamespace; } + @Override public void detachNode() { Node parent = getParentNode(); if (parent != null) { @@ -1184,6 +1328,7 @@ } } + @Override public void recycleNode() { detachNode(); // TBD @@ -1260,10 +1405,12 @@ int attributeIndex = 0; String currentName; + @Override public boolean hasNext() { return attributeIndex < attributesLength; } + @Override public Name next() { if (!hasNext()) { throw new NoSuchElementException(); @@ -1283,6 +1430,7 @@ } } + @Override public void remove() { if (currentName == null) { throw new IllegalStateException(); @@ -1331,13 +1479,14 @@ return attribute == null ? null : attribute.getValue(); } - protected Iterator<Node> getChildElementsFrom(final Element element) { - return new Iterator<Node>() { + protected Iterator<javax.xml.soap.Node> getChildElementsFrom(final Element element) { + return new Iterator<javax.xml.soap.Node>() { Node next = element.getFirstChild(); Node nextNext = null; Node last = null; - Node soapElement = getSoapDocument().findIfPresent(element); + Node soapElement = soapDocument.findIfPresent(element); + @Override public boolean hasNext() { if (next != null) { return true; @@ -1349,7 +1498,8 @@ return next != null; } - public Node next() { + @Override + public javax.xml.soap.Node next() { if (hasNext()) { last = next; next = null; @@ -1362,11 +1512,12 @@ } nextNext = last.getNextSibling(); - return getSoapDocument().findIfPresent(last); + return (javax.xml.soap.Node) soapDocument.findIfPresent(last); } throw new NoSuchElementException(); } + @Override public void remove() { if (last == null) { throw new IllegalStateException(); @@ -1428,6 +1579,7 @@ //TODO: This is a temporary SAAJ workaround for optimizing XWS // should be removed once the corresponding JAXP bug is fixed // It appears the bug will be fixed in JAXP 1.4 (not by Appserver 9 timeframe) + @Override public void setAttributeNS( String namespaceURI,String qualifiedName, String value) { int index = qualifiedName.indexOf(':'); @@ -1483,7 +1635,7 @@ @Override public NodeList getElementsByTagNameNS(String namespaceURI, String localName) throws DOMException { - return new NodeListImpl(getSoapDocument(), element.getElementsByTagNameNS(namespaceURI, localName)); + return new NodeListImpl(soapDocument, element.getElementsByTagNameNS(namespaceURI, localName)); } @Override @@ -1538,37 +1690,37 @@ @Override public Node getParentNode() { - return getSoapDocument().find(element.getParentNode()); + return soapDocument.find(element.getParentNode()); } @Override public NodeList getChildNodes() { - return new NodeListImpl(getSoapDocument(), element.getChildNodes()); + return new NodeListImpl(soapDocument, element.getChildNodes()); } @Override public Node getFirstChild() { - return getSoapDocument().findIfPresent(element.getFirstChild()); + return soapDocument.findIfPresent(element.getFirstChild()); } @Override public Node getLastChild() { - return getSoapDocument().findIfPresent(element.getLastChild()); + return soapDocument.findIfPresent(element.getLastChild()); } @Override public Node getPreviousSibling() { - return getSoapDocument().findIfPresent(element.getPreviousSibling()); + return soapDocument.findIfPresent(element.getPreviousSibling()); } @Override public Node getNextSibling() { - return getSoapDocument().findIfPresent(element.getNextSibling()); + return soapDocument.findIfPresent(element.getNextSibling()); } @Override public NamedNodeMap getAttributes() { - return element.getAttributes(); + return new NamedNodeMapImpl(element.getAttributes(), soapDocument); } public Element getDomElement() {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/EnvelopeImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/EnvelopeImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -100,6 +100,7 @@ protected abstract NameImpl getHeaderName(String prefix); protected abstract NameImpl getBodyName(String prefix); + @Override public SOAPHeader addHeader() throws SOAPException { return addHeader(null); } @@ -140,6 +141,7 @@ header = hdr; } + @Override public SOAPHeader getHeader() throws SOAPException { lookForHeader(); return header; @@ -152,6 +154,7 @@ body = bodyChildElement; } + @Override public SOAPBody addBody() throws SOAPException { return addBody(null); } @@ -176,6 +179,7 @@ return body; } + @Override protected SOAPElement addElement(Name name) throws SOAPException { if (getBodyName(null).equals(name)) { return addBody(name.getPrefix()); @@ -187,6 +191,7 @@ return super.addElement(name); } + @Override protected SOAPElement addElement(QName name) throws SOAPException { if (getBodyName(null).equals(NameImpl.convertToName(name))) { return addBody(name.getPrefix()); @@ -198,15 +203,18 @@ return super.addElement(name); } + @Override public SOAPBody getBody() throws SOAPException { lookForBody(); return body; } + @Override public Source getContent() { return new DOMSource(getOwnerDocument()); } + @Override public Name createName(String localName, String prefix, String uri) throws SOAPException { @@ -241,6 +249,7 @@ return NameImpl.create(localName, prefix, namespace); } + @Override public Name createName(String localName) throws SOAPException { return NameImpl.createFromUnqualifiedName(localName); } @@ -257,6 +266,7 @@ charset = value; } + @Override public void output(OutputStream out) throws IOException { try { // materializeBody(); @@ -301,6 +311,7 @@ /** * Serialize to FI if boolean parameter set. */ + @Override public void output(OutputStream out, boolean isFastInfoset) throws IOException { @@ -353,6 +364,7 @@ // } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { log.log(Level.SEVERE, "SAAJ0146.impl.invalid.name.change.requested", @@ -389,6 +401,7 @@ final DOMStreamReader reader = new DOMStreamReader(this); XMLStreamReaderToXMLStreamWriter writingBridge = new XMLStreamReaderToXMLStreamWriter(); writingBridge.bridge( new XMLStreamReaderToXMLStreamWriter.Breakpoint(reader, writer) { + @Override public boolean proceedAfterStartElement() { if ("Body".equals(reader.getLocalName()) && soapEnvNS.equals(reader.getNamespaceURI()) ){ return false;
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/FaultElementImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/FaultElementImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -54,6 +54,7 @@ protected abstract boolean isStandardFaultElement(); + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { log.log(Level.SEVERE, "SAAJ0146.impl.invalid.name.change.requested",
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/HeaderElementImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/HeaderElementImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -30,6 +30,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; +import org.w3c.dom.Element; public abstract class HeaderElementImpl extends ElementImpl @@ -47,6 +48,10 @@ super(ownerDoc, qname); } + public HeaderElementImpl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + protected abstract NameImpl getActorAttributeName(); protected abstract NameImpl getRoleAttributeName(); protected abstract NameImpl getMustunderstandAttributeName(); @@ -58,6 +63,7 @@ protected abstract String getActorOrRole(); + @Override public void setParentElement(SOAPElement element) throws SOAPException { if (!(element instanceof SOAPHeader)) { log.severe("SAAJ0130.impl.header.elem.parent.mustbe.header"); @@ -67,6 +73,7 @@ super.setParentElement(element); } + @Override public void setActor(String actorUri) { try { removeAttribute(getActorAttributeName()); @@ -76,6 +83,7 @@ } //SOAP 1.2 supports Role + @Override public void setRole(String roleUri) throws SOAPException { // runtime exception thrown if called for SOAP 1.1 removeAttribute(getRoleAttributeName()); @@ -85,6 +93,7 @@ Name actorAttNameWithoutNS = NameImpl.createFromTagName("actor"); + @Override public String getActor() { String actor = getAttributeValue(getActorAttributeName()); return actor; @@ -92,12 +101,14 @@ Name roleAttNameWithoutNS = NameImpl.createFromTagName("role"); + @Override public String getRole() { // runtime exception thrown for 1.1 String role = getAttributeValue(getRoleAttributeName()); return role; } + @Override public void setMustUnderstand(boolean mustUnderstand) { try { removeAttribute(getMustunderstandAttributeName()); @@ -108,6 +119,7 @@ } } + @Override public boolean getMustUnderstand() { String mu = getAttributeValue(getMustunderstandAttributeName()); @@ -117,6 +129,7 @@ return false; } + @Override public void setRelay(boolean relay) throws SOAPException { // runtime exception thrown for 1.1 removeAttribute(getRelayAttributeName()); @@ -125,6 +138,7 @@ getRelayLiteralValue(relay)); } + @Override public boolean getRelay() { String mu = getAttributeValue(getRelayAttributeName()); if (mu != null)
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/HeaderImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/HeaderImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -25,19 +25,25 @@ package com.sun.xml.internal.messaging.saaj.soap.impl; -import java.util.*; import java.util.logging.Level; import javax.xml.namespace.QName; -import javax.xml.soap.*; -import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; import org.w3c.dom.Element; import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; public abstract class HeaderImpl extends ElementImpl implements SOAPHeader { protected static final boolean MUST_UNDERSTAND_ONLY = false; @@ -58,6 +64,7 @@ protected abstract NameImpl getUpgradeName(); protected abstract NameImpl getSupportedEnvelopeName(); + @Override public SOAPHeaderElement addHeaderElement(Name name) throws SOAPException { SOAPElement newHeaderElement = ElementFactory.createNamedElement( @@ -81,6 +88,7 @@ return (SOAPHeaderElement) newHeaderElement; } + @Override public SOAPHeaderElement addHeaderElement(QName name) throws SOAPException { SOAPElement newHeaderElement = ElementFactory.createNamedElement( @@ -104,19 +112,23 @@ return (SOAPHeaderElement) newHeaderElement; } + @Override protected SOAPElement addElement(Name name) throws SOAPException { return addHeaderElement(name); } + @Override protected SOAPElement addElement(QName name) throws SOAPException { return addHeaderElement(name); } - public Iterator examineHeaderElements(String actor) { + @Override + public Iterator<SOAPHeaderElement> examineHeaderElements(String actor) { return getHeaderElementsForActor(actor, false, false); } - public Iterator extractHeaderElements(String actor) { + @Override + public Iterator<SOAPHeaderElement> extractHeaderElements(String actor) { return getHeaderElementsForActor(actor, true, false); } @@ -135,9 +147,9 @@ String actor, boolean detach, boolean mustUnderstand) { - List<SOAPHeaderElement> elementList = new ArrayList<SOAPHeaderElement>(); + List<SOAPHeaderElement> elementList = new ArrayList<>(); - Iterator<org.w3c.dom.Node> eachChild = getChildElements(); + Iterator<javax.xml.soap.Node> eachChild = getChildElements(); org.w3c.dom.Node currentChild = iterate(eachChild); while (currentChild != null) { @@ -181,6 +193,7 @@ return each.hasNext() ? each.next() : null; } + @Override public void setParentElement(SOAPElement element) throws SOAPException { if (!(element instanceof SOAPEnvelope)) { log.severe("SAAJ0133.impl.header.parent.mustbe.envelope"); @@ -193,6 +206,7 @@ // namespace qualified. Holds for both SOAP versions. // TODO - This check needs to be made for other addChildElement() methods // as well. + @Override public SOAPElement addChildElement(String localName) throws SOAPException { SOAPElement element = super.addChildElement(localName); @@ -205,19 +219,23 @@ return element; } - public Iterator examineAllHeaderElements() { + @Override + public Iterator<SOAPHeaderElement> examineAllHeaderElements() { return getHeaderElements(null, false, MUST_UNDERSTAND_ONLY); } - public Iterator examineMustUnderstandHeaderElements(String actor) { + @Override + public Iterator<SOAPHeaderElement> examineMustUnderstandHeaderElements(String actor) { return getHeaderElements(actor, false, true); } - public Iterator extractAllHeaderElements() { + @Override + public Iterator<SOAPHeaderElement> extractAllHeaderElements() { return getHeaderElements(null, true, false); } + @Override public SOAPHeaderElement addUpgradeHeaderElement(Iterator supportedSoapUris) throws SOAPException { if (supportedSoapUris == null) { @@ -241,18 +259,19 @@ NameImpl.createFromUnqualifiedName("qname"), ns + ":Envelope"); subElement.addNamespaceDeclaration( - ns, - (String) supportedSoapUris.next()); + ns, (String) supportedSoapUris.next()); i ++; } return upgradeHeaderElement; } + @Override public SOAPHeaderElement addUpgradeHeaderElement(String supportedSoapUri) throws SOAPException { return addUpgradeHeaderElement(new String[] {supportedSoapUri}); } + @Override public SOAPHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris) throws SOAPException { @@ -280,6 +299,7 @@ return upgradeHeaderElement; } + @Override protected SOAPElement convertToSoapElement(Element element) { final org.w3c.dom.Node soapNode = getSoapDocument().findIfPresent(element); if (soapNode instanceof SOAPHeaderElement) { @@ -298,6 +318,7 @@ } } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { log.log(Level.SEVERE, "SAAJ0146.impl.invalid.name.change.requested",
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/LocalStrings.properties Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/LocalStrings.properties Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2017, 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 @@ -46,7 +46,7 @@ SAAJ0123.impl.no.reserved.xmlns=SAAJ0123: Cannot declare reserved xmlns prefix SAAJ0124.impl.qualified.name.cannot.be.xmlns=SAAJ0124: Qualified name cannot be xmlns #SAAJ0125.impl.URI.cannot.be.null=SAAJ0125: URI cannot be null -SAAJ0126.impl.cannot.locate.ns=SAAJ0126: Unable to locate namespace for prefix {0} +#SAAJ0126.impl.cannot.locate.ns=SAAJ0126: Unable to locate namespace for prefix {0} SAAJ0127.impl.no.null.for.parent.elem=SAAJ0127: Cannot pass NULL to setParentElement SAAJ0130.impl.header.elem.parent.mustbe.header=SAAJ0130: Parent of a SOAPHeaderElement has to be a SOAPHeader @@ -60,7 +60,7 @@ SAAJ0142.impl.reason.or.text.not.supported=SAAJ0142: Fault/Reason/Text not supported by this SOAP version, try SOAP 1.2 or later SAAJ0143.impl.node.not.supported=SAAJ0143: Fault/Node not supported by this SOAP version, try SOAP 1.2 or later SAAJ0144.impl.role.not.supported=SAAJ0144: Fault/Role not supported by this SOAP version, try SOAP 1.2 or later -SAAJ0145.impl.no.null.to.parent.elem=SAAJ0145: Cannot pass NULL to setParentElement +#SAAJ0145.impl.no.null.to.parent.elem=SAAJ0145: Cannot pass NULL to setParentElement SAAJ0146.impl.invalid.name.change.requested=SAAJ0146: Cannot change name of element {0} to {1} SAAJ0147.impl.invalid.uri.change.requested=SAAJ0147: Cannot change the URI for prefix {0} from {1} to {2} in setElementQName SAAJ0148.impl.invalid.prefix.for.uri=Non-empty namespace URI: {0} for an empty prefix in SetElementQName
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/NamedNodeMapImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.sun.xml.internal.messaging.saaj.soap.impl; + +import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; +import org.w3c.dom.DOMException; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +/** + * {@link NamedNodeMap} wrapper, finding SOAP elements automatically when possible. + * + * @author Roman Grigoriadi + */ +public class NamedNodeMapImpl implements NamedNodeMap { + + private final NamedNodeMap namedNodeMap; + + private final SOAPDocumentImpl soapDocument; + + /** + * Create wrapper. + * + * @param namedNodeMap node map to wrap + * @param soapDocument soap document to find soap elements + */ + public NamedNodeMapImpl(NamedNodeMap namedNodeMap, SOAPDocumentImpl soapDocument) { + this.namedNodeMap = namedNodeMap; + this.soapDocument = soapDocument; + } + + @Override + public Node getNamedItem(String name) { + return soapDocument.findIfPresent(namedNodeMap.getNamedItem(name)); + } + + @Override + public Node setNamedItem(Node arg) throws DOMException { + return namedNodeMap.setNamedItem(arg); + } + + @Override + public Node removeNamedItem(String name) throws DOMException { + return namedNodeMap.removeNamedItem(name); + } + + @Override + public Node item(int index) { + return namedNodeMap.item(index); + } + + @Override + public int getLength() { + return namedNodeMap.getLength(); + } + + @Override + public Node getNamedItemNS(String namespaceURI, String localName) throws DOMException { + return namedNodeMap.getNamedItemNS(namespaceURI, localName); + } + + @Override + public Node setNamedItemNS(Node arg) throws DOMException { + return namedNodeMap.setNamedItemNS(arg); + } + + @Override + public Node removeNamedItemNS(String namespaceURI, String localName) throws DOMException { + return namedNodeMap.removeNamedItemNS(namespaceURI, localName); + } +}
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/SOAPCommentImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/SOAPCommentImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -25,327 +25,64 @@ package com.sun.xml.internal.messaging.saaj.soap.impl; -import java.util.ResourceBundle; -import java.util.logging.Logger; - -import javax.xml.soap.SOAPElement; -import javax.xml.soap.SOAPException; - -import com.sun.xml.internal.messaging.saaj.util.SAAJUtil; +import org.w3c.dom.CharacterData; import org.w3c.dom.Comment; import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.w3c.dom.Text; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; -import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; -import org.w3c.dom.UserDataHandler; - -public class SOAPCommentImpl - implements javax.xml.soap.Text, org.w3c.dom.Comment { - - protected static final Logger log = - Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN, - "com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings"); - protected static ResourceBundle rb = - log.getResourceBundle(); - - @Override - public String getData() throws DOMException { - return comment.getData(); - } - - @Override - public void setData(String data) throws DOMException { - comment.setData(data); - } - - @Override - public int getLength() { - return comment.getLength(); - } +import static com.sun.xml.internal.messaging.saaj.soap.impl.TextImpl.log; - @Override - public String substringData(int offset, int count) throws DOMException { - return comment.substringData(offset, count); - } - - @Override - public void appendData(String arg) throws DOMException { - comment.appendData(arg); - } - - @Override - public void insertData(int offset, String arg) throws DOMException { - comment.insertData(offset, arg); - } +public class SOAPCommentImpl extends TextImpl<Comment> implements Comment { - @Override - public void deleteData(int offset, int count) throws DOMException { - comment.deleteData(offset, count); - } - - @Override - public void replaceData(int offset, int count, String arg) throws DOMException { - comment.replaceData(offset, count, arg); - } - - @Override - public String getNodeName() { - return comment.getNodeName(); - } - - @Override - public String getNodeValue() throws DOMException { - return comment.getNodeValue(); + public SOAPCommentImpl(SOAPDocumentImpl ownerDoc, String text) { + super(ownerDoc, text); } - @Override - public void setNodeValue(String nodeValue) throws DOMException { - comment.setNodeValue(nodeValue); - } - - @Override - public short getNodeType() { - return comment.getNodeType(); - } - - @Override - public Node getParentNode() { - return comment.getParentNode(); - } - - @Override - public NodeList getChildNodes() { - return comment.getChildNodes(); - } - - @Override - public Node getFirstChild() { - return comment.getFirstChild(); - } - - @Override - public Node getLastChild() { - return comment.getLastChild(); - } - - @Override - public Node getPreviousSibling() { - return comment.getPreviousSibling(); - } - - @Override - public Node getNextSibling() { - return comment.getNextSibling(); - } - - @Override - public NamedNodeMap getAttributes() { - return comment.getAttributes(); - } - - @Override - public Document getOwnerDocument() { - return comment.getOwnerDocument(); - } - - @Override - public Node insertBefore(Node newChild, Node refChild) throws DOMException { - return comment.insertBefore(newChild, refChild); - } - - @Override - public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - return comment.replaceChild(newChild, oldChild); - } - - @Override - public Node removeChild(Node oldChild) throws DOMException { - return comment.removeChild(oldChild); + public SOAPCommentImpl(SOAPDocumentImpl ownerDoc, CharacterData data) { + super(ownerDoc, data); } @Override - public Node appendChild(Node newChild) throws DOMException { - return comment.appendChild(newChild); - } - - @Override - public boolean hasChildNodes() { - return comment.hasChildNodes(); - } - - @Override - public Node cloneNode(boolean deep) { - return comment.cloneNode(deep); - } - - @Override - public void normalize() { - comment.normalize(); - } - - @Override - public boolean isSupported(String feature, String version) { - return comment.isSupported(feature, version); - } - - @Override - public String getNamespaceURI() { - return comment.getNamespaceURI(); - } - - @Override - public String getPrefix() { - return comment.getPrefix(); - } - - @Override - public void setPrefix(String prefix) throws DOMException { - comment.setPrefix(prefix); - } - - @Override - public String getLocalName() { - return comment.getLocalName(); - } - - @Override - public boolean hasAttributes() { - return comment.hasAttributes(); - } - - @Override - public String getBaseURI() { - return comment.getBaseURI(); - } - - @Override - public short compareDocumentPosition(Node other) throws DOMException { - return comment.compareDocumentPosition(other); - } - - @Override - public String getTextContent() throws DOMException { - return comment.getTextContent(); - } - - @Override - public void setTextContent(String textContent) throws DOMException { - comment.setTextContent(textContent); - } - - @Override - public boolean isSameNode(Node other) { - return comment.isSameNode(other); + protected Comment createN(SOAPDocumentImpl ownerDoc, String text) { + Comment c = ownerDoc.getDomDocument().createComment(text); +// ownerDoc.register(this); + return c; } @Override - public String lookupPrefix(String namespaceURI) { - return comment.lookupPrefix(namespaceURI); - } - - @Override - public boolean isDefaultNamespace(String namespaceURI) { - return comment.isDefaultNamespace(namespaceURI); - } - - @Override - public String lookupNamespaceURI(String prefix) { - return comment.lookupNamespaceURI(prefix); - } - - @Override - public boolean isEqualNode(Node arg) { - return comment.isEqualNode(arg); - } - - @Override - public Object getFeature(String feature, String version) { - return comment.getFeature(feature, version); - } - - @Override - public Object setUserData(String key, Object data, UserDataHandler handler) { - return comment.setUserData(key, data, handler); + protected Comment createN(SOAPDocumentImpl ownerDoc, CharacterData data) { + Comment c = (Comment) data; + return c; } @Override - public Object getUserData(String key) { - return comment.getUserData(key); - } - - private Comment comment; - - public SOAPCommentImpl(SOAPDocumentImpl ownerDoc, String text) { - comment = ownerDoc.getDomDocument().createComment(text); - ownerDoc.register(this); - } - - public String getValue() { - String nodeValue = getNodeValue(); - return (nodeValue.equals("") ? null : nodeValue); - } - - public void setValue(String text) { - setNodeValue(text); - } - - - public void setParentElement(SOAPElement element) throws SOAPException { - if (element == null) { - log.severe("SAAJ0112.impl.no.null.to.parent.elem"); - throw new SOAPException("Cannot pass NULL to setParentElement"); - } - ((ElementImpl) element).addNode(this); - } - - public SOAPElement getParentElement() { - return (SOAPElement) getParentNode(); - } - - public void detachNode() { - org.w3c.dom.Node parent = getParentNode(); - if (parent != null) { - parent.removeChild(this); - } - } - - public void recycleNode() { - detachNode(); - // TBD - // - add this to the factory so subsequent - // creations can reuse this object. - } - public boolean isComment() { return true; } + @Override public Text splitText(int offset) throws DOMException { log.severe("SAAJ0113.impl.cannot.split.text.from.comment"); throw new UnsupportedOperationException("Cannot split text from a Comment Node."); } + @Override public Text replaceWholeText(String content) throws DOMException { log.severe("SAAJ0114.impl.cannot.replace.wholetext.from.comment"); throw new UnsupportedOperationException("Cannot replace Whole Text from a Comment Node."); } + @Override public String getWholeText() { //TODO: maybe we have to implement this in future. throw new UnsupportedOperationException("Not Supported"); } + @Override public boolean isElementContentWhitespace() { //TODO: maybe we have to implement this in future. throw new UnsupportedOperationException("Not Supported"); } - public Comment getDomElement() { - return comment; - } }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/SOAPTextImpl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/SOAPTextImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -25,316 +25,55 @@ package com.sun.xml.internal.messaging.saaj.soap.impl; -import java.util.logging.Logger; - -import javax.xml.soap.SOAPElement; -import javax.xml.soap.SOAPException; - import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; -import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import org.w3c.dom.CharacterData; import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import org.w3c.dom.Text; -import org.w3c.dom.UserDataHandler; + +public class SOAPTextImpl extends TextImpl<Text> implements Text { + + public SOAPTextImpl(SOAPDocumentImpl ownerDoc, String text) { + super(ownerDoc, text); + } + + public SOAPTextImpl(SOAPDocumentImpl ownerDoc, CharacterData data) { + super(ownerDoc, data); + } -public class SOAPTextImpl - implements javax.xml.soap.Text, org.w3c.dom.Text { + @Override + protected Text createN(SOAPDocumentImpl ownerDoc, String text) { + Text t = ownerDoc.getDomDocument().createTextNode(text); +// ownerDoc.register(this); + return t; + } + + @Override + protected Text createN(SOAPDocumentImpl ownerDoc, CharacterData data) { + Text t = (Text) data; + return t; + } @Override public Text splitText(int offset) throws DOMException { - return textNode.splitText(offset); + return getDomElement().splitText(offset); } @Override public boolean isElementContentWhitespace() { - return textNode.isElementContentWhitespace(); + return getDomElement().isElementContentWhitespace(); } @Override public String getWholeText() { - return textNode.getWholeText(); + return getDomElement().getWholeText(); } @Override public Text replaceWholeText(String content) throws DOMException { - return textNode.replaceWholeText(content); - } - - @Override - public String getData() throws DOMException { - return textNode.getData(); - } - - @Override - public void setData(String data) throws DOMException { - textNode.setData(data); - } - - @Override - public int getLength() { - return textNode.getLength(); - } - - @Override - public String substringData(int offset, int count) throws DOMException { - return textNode.substringData(offset, count); - } - - @Override - public void appendData(String arg) throws DOMException { - textNode.appendData(arg); - } - - @Override - public void insertData(int offset, String arg) throws DOMException { - textNode.insertData(offset, arg); - } - - @Override - public void deleteData(int offset, int count) throws DOMException { - textNode.deleteData(offset, count); - } - - @Override - public void replaceData(int offset, int count, String arg) throws DOMException { - textNode.replaceData(offset, count, arg); - } - - @Override - public String getNodeName() { - return textNode.getNodeName(); - } - - @Override - public String getNodeValue() throws DOMException { - return textNode.getNodeValue(); - } - - @Override - public void setNodeValue(String nodeValue) throws DOMException { - textNode.setNodeValue(nodeValue); - } - - @Override - public short getNodeType() { - return textNode.getNodeType(); - } - - @Override - public Node getParentNode() { - return textNode.getParentNode(); - } - - @Override - public NodeList getChildNodes() { - return textNode.getChildNodes(); - } - - @Override - public Node getFirstChild() { - return textNode.getFirstChild(); - } - - @Override - public Node getLastChild() { - return textNode.getLastChild(); - } - - @Override - public Node getPreviousSibling() { - return textNode.getPreviousSibling(); - } - - @Override - public Node getNextSibling() { - return textNode.getNextSibling(); - } - - @Override - public NamedNodeMap getAttributes() { - return textNode.getAttributes(); - } - - @Override - public Document getOwnerDocument() { - return textNode.getOwnerDocument(); - } - - @Override - public Node insertBefore(Node newChild, Node refChild) throws DOMException { - return textNode.insertBefore(newChild, refChild); - } - - @Override - public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - return textNode.replaceChild(newChild, oldChild); - } - - @Override - public Node removeChild(Node oldChild) throws DOMException { - return textNode.removeChild(oldChild); - } - - @Override - public Node appendChild(Node newChild) throws DOMException { - return textNode.appendChild(newChild); - } - - @Override - public boolean hasChildNodes() { - return textNode.hasChildNodes(); - } - - @Override - public Node cloneNode(boolean deep) { - return textNode.cloneNode(deep); + return getDomElement().replaceWholeText(content); } @Override - public void normalize() { - textNode.normalize(); - } - - @Override - public boolean isSupported(String feature, String version) { - return textNode.isSupported(feature, version); - } - - @Override - public String getNamespaceURI() { - return textNode.getNamespaceURI(); - } - - @Override - public String getPrefix() { - return textNode.getPrefix(); - } - - @Override - public void setPrefix(String prefix) throws DOMException { - textNode.setPrefix(prefix); - } - - @Override - public String getLocalName() { - return textNode.getLocalName(); - } - - @Override - public boolean hasAttributes() { - return textNode.hasAttributes(); - } - - @Override - public String getBaseURI() { - return textNode.getBaseURI(); - } - - @Override - public short compareDocumentPosition(Node other) throws DOMException { - return textNode.compareDocumentPosition(other); - } - - @Override - public String getTextContent() throws DOMException { - return textNode.getTextContent(); - } - - @Override - public void setTextContent(String textContent) throws DOMException { - textNode.setTextContent(textContent); - } - - @Override - public boolean isSameNode(Node other) { - return textNode.isSameNode(other); - } - - @Override - public String lookupPrefix(String namespaceURI) { - return textNode.lookupPrefix(namespaceURI); - } - - @Override - public boolean isDefaultNamespace(String namespaceURI) { - return textNode.isDefaultNamespace(namespaceURI); - } - - @Override - public String lookupNamespaceURI(String prefix) { - return textNode.lookupNamespaceURI(prefix); - } - - @Override - public boolean isEqualNode(Node arg) { - return textNode.isEqualNode(arg); - } - - @Override - public Object getFeature(String feature, String version) { - return textNode.getFeature(feature, version); - } - - @Override - public Object setUserData(String key, Object data, UserDataHandler handler) { - return textNode.setUserData(key, data, handler); - } - - @Override - public Object getUserData(String key) { - return textNode.getUserData(key); - } - - protected static final Logger log = - Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN, - "com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings"); - - private Text textNode; - - public SOAPTextImpl(SOAPDocumentImpl ownerDoc, String text) { - textNode = ownerDoc.getDomDocument().createTextNode(text); - ownerDoc.register(this); - } - - public String getValue() { - String nodeValue = getNodeValue(); - return (nodeValue.equals("") ? null : nodeValue); - } - - public void setValue(String text) { - setNodeValue(text); - } - - public void setParentElement(SOAPElement parent) throws SOAPException { - if (parent == null) { - log.severe("SAAJ0126.impl.cannot.locate.ns"); - throw new SOAPException("Cannot pass NULL to setParentElement"); - } - ((ElementImpl) parent).addNode(this); - } - - public SOAPElement getParentElement() { - return (SOAPElement) getParentNode(); - } - - - public void detachNode() { - org.w3c.dom.Node parent = getParentNode(); - if (parent != null) { - parent.removeChild(getDomElement()); - } - } - - public void recycleNode() { - detachNode(); - // TBD - // - add this to the factory so subsequent - // creations can reuse this object. - } - public boolean isComment() { String txt = getNodeValue(); if (txt == null) { @@ -343,7 +82,4 @@ return txt.startsWith("<!--") && txt.endsWith("-->"); } - public Text getDomElement() { - return textNode; - } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/TextImpl.java Mon Jul 10 15:54:38 2017 +0200 @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 com.sun.xml.internal.messaging.saaj.soap.impl; + +import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; +import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import java.util.logging.Logger; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; +import javax.xml.soap.Text; +import org.w3c.dom.CharacterData; +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.UserDataHandler; + +/** + * + * @author lukas + * @param <T> + */ +public abstract class TextImpl<T extends CharacterData> implements Text, CharacterData { + + protected static final Logger log + = Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN, + "com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings"); + private final T domNode; + + private final SOAPDocumentImpl soapDocument; + + protected TextImpl(SOAPDocumentImpl ownerDoc, String text) { + this.soapDocument = ownerDoc; + domNode = createN(ownerDoc, text); + ownerDoc.register(this); + } + + protected TextImpl(SOAPDocumentImpl ownerDoc, CharacterData data) { + this.soapDocument = ownerDoc; + domNode = createN(ownerDoc, data); + ownerDoc.register(this); + } + + protected abstract T createN(SOAPDocumentImpl ownerDoc, CharacterData data); + + protected abstract T createN(SOAPDocumentImpl ownerDoc, String text); + + public T getDomElement() { + return domNode; + } + + @Override + public String getValue() { + String nodeValue = getNodeValue(); + return (nodeValue.equals("") ? null : nodeValue); + } + + @Override + public void setValue(String text) { + setNodeValue(text); + } + + @Override + public void setParentElement(SOAPElement parent) throws SOAPException { + if (parent == null) { + log.severe("SAAJ0112.impl.no.null.to.parent.elem"); + throw new SOAPException("Cannot pass NULL to setParentElement"); + } + ((ElementImpl) parent).addNode(this); + } + + @Override + public SOAPElement getParentElement() { + return (SOAPElement) getParentNode(); + } + + @Override + public void detachNode() { + org.w3c.dom.Node parent = getParentNode(); + if (parent != null) { + parent.removeChild(getDomElement()); + } + } + + @Override + public void recycleNode() { + detachNode(); + // TBD + // - add this to the factory so subsequent + // creations can reuse this object. + } + + @Override + public String getNodeName() { + return domNode.getNodeName(); + } + + @Override + public String getNodeValue() throws DOMException { + return domNode.getNodeValue(); + } + + @Override + public void setNodeValue(String nodeValue) throws DOMException { + domNode.setNodeValue(nodeValue); + } + + @Override + public short getNodeType() { + return domNode.getNodeType(); + } + + @Override + public Node getParentNode() { + return domNode.getParentNode(); + } + + @Override + public NodeList getChildNodes() { + return domNode.getChildNodes(); + } + + @Override + public Node getFirstChild() { + return domNode.getFirstChild(); + } + + @Override + public Node getLastChild() { + return domNode.getLastChild(); + } + + @Override + public Node getPreviousSibling() { + return domNode.getPreviousSibling(); + } + + @Override + public Node getNextSibling() { + return domNode.getNextSibling(); + } + + @Override + public NamedNodeMap getAttributes() { + return domNode.getAttributes(); + } + + @Override + public Document getOwnerDocument() { + return domNode.getOwnerDocument(); + } + + @Override + public Node insertBefore(Node newChild, Node refChild) throws DOMException { + return domNode.insertBefore(newChild, refChild); + } + + @Override + public Node replaceChild(Node newChild, Node oldChild) throws DOMException { + return domNode.replaceChild(newChild, oldChild); + } + + @Override + public Node removeChild(Node oldChild) throws DOMException { + return domNode.removeChild(oldChild); + } + + @Override + public Node appendChild(Node newChild) throws DOMException { + return domNode.appendChild(newChild); + } + + @Override + public boolean hasChildNodes() { + return domNode.hasChildNodes(); + } + + @Override + public Node cloneNode(boolean deep) { + return domNode.cloneNode(deep); + } + + @Override + public void normalize() { + domNode.normalize(); + } + + @Override + public boolean isSupported(String feature, String version) { + return domNode.isSupported(feature, version); + } + + @Override + public String getNamespaceURI() { + return domNode.getNamespaceURI(); + } + + @Override + public String getPrefix() { + return domNode.getPrefix(); + } + + @Override + public void setPrefix(String prefix) throws DOMException { + domNode.setPrefix(prefix); + } + + @Override + public String getLocalName() { + return domNode.getLocalName(); + } + + @Override + public boolean hasAttributes() { + return domNode.hasAttributes(); + } + + @Override + public String getBaseURI() { + return domNode.getBaseURI(); + } + + @Override + public short compareDocumentPosition(Node other) throws DOMException { + return domNode.compareDocumentPosition(other); + } + + @Override + public String getTextContent() throws DOMException { + return domNode.getTextContent(); + } + + @Override + public void setTextContent(String textContent) throws DOMException { + domNode.setTextContent(textContent);; + } + + @Override + public boolean isSameNode(Node other) { + return domNode.isSameNode(other); + } + + @Override + public String lookupPrefix(String namespaceURI) { + return domNode.lookupPrefix(namespaceURI); + } + + @Override + public boolean isDefaultNamespace(String namespaceURI) { + return domNode.isDefaultNamespace(namespaceURI); + } + + @Override + public String lookupNamespaceURI(String prefix) { + return domNode.lookupNamespaceURI(prefix); + } + + @Override + public boolean isEqualNode(Node arg) { + return domNode.isEqualNode(arg); + } + + @Override + public Object getFeature(String feature, String version) { + return domNode.getFeature(feature, version); + } + + @Override + public Object setUserData(String key, Object data, UserDataHandler handler) { + return domNode.setUserData(key, data, handler); + } + + @Override + public Object getUserData(String key) { + return domNode.getUserData(key); + } + + @Override + public String getData() throws DOMException { + return domNode.getData(); + } + + @Override + public void setData(String data) throws DOMException { + domNode.setData(data); + } + + @Override + public int getLength() { + return domNode.getLength(); + } + + @Override + public String substringData(int offset, int count) throws DOMException { + return domNode.substringData(offset, count); + } + + @Override + public void appendData(String arg) throws DOMException { + domNode.appendData(arg); + } + + @Override + public void insertData(int offset, String arg) throws DOMException { + domNode.insertData(offset, arg); + } + + @Override + public void deleteData(int offset, int count) throws DOMException { + domNode.deleteData(offset, count); + } + + @Override + public void replaceData(int offset, int count, String arg) throws DOMException { + domNode.replaceData(offset, count, arg); + } + +}
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Body1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Body1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -54,32 +54,38 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override protected NameImpl getFaultName(String name) { // Ignore name return NameImpl.createFault1_1Name(null); } + @Override protected SOAPBodyElement createBodyElement(Name name) { return new BodyElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected SOAPBodyElement createBodyElement(QName name) { return new BodyElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected QName getDefaultFaultCode() { return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server"); } + @Override protected boolean isFault(SOAPElement child) { // SOAP 1.1 faults always use the default name return child.getElementName().equals(getFaultName(null)); } + @Override protected SOAPFault createFaultElement() { return new Fault1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), getPrefix());
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/BodyElement1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/BodyElement1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -36,6 +36,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.BodyElementImpl; +import org.w3c.dom.Element; public class BodyElement1_1Impl extends BodyElementImpl { @@ -45,6 +46,12 @@ public BodyElement1_1Impl(SOAPDocumentImpl ownerDoc, QName qname) { super(ownerDoc, qname); } + + public BodyElement1_1Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { BodyElementImpl copy = new BodyElement1_1Impl((SOAPDocumentImpl) getOwnerDocument(), newName);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Detail1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Detail1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -51,11 +51,13 @@ super(ownerDoc, domElement); } + @Override protected DetailEntry createDetailEntry(Name name) { return new DetailEntry1_1Impl( (SOAPDocumentImpl) getOwnerDocument(), name); } + @Override protected DetailEntry createDetailEntry(QName name) { return new DetailEntry1_1Impl( (SOAPDocumentImpl) getOwnerDocument(),
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/DetailEntry1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/DetailEntry1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -36,6 +36,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.DetailEntryImpl; +import org.w3c.dom.Element; public class DetailEntry1_1Impl extends DetailEntryImpl { @@ -45,6 +46,12 @@ public DetailEntry1_1Impl(SOAPDocumentImpl ownerDoc, QName qname) { super(ownerDoc, qname); } + + public DetailEntry1_1Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { DetailEntryImpl copy = new DetailEntry1_1Impl((SOAPDocumentImpl) getOwnerDocument(), newName);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Envelope1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Envelope1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -58,10 +58,12 @@ super(ownerDoc, domElement); } + @Override protected NameImpl getBodyName(String prefix) { return NameImpl.createBody1_1Name(prefix); } + @Override protected NameImpl getHeaderName(String prefix) { return NameImpl.createHeader1_1Name(prefix); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Fault1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Fault1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -60,37 +60,48 @@ super(ownerDocument, NameImpl.createFault1_1Name(prefix)); } - public Fault1_1Impl(Element domElement, SOAPDocumentImpl ownerDoc) { + public Fault1_1Impl(SOAPDocumentImpl ownerDoc, Element domElement) { super(ownerDoc, domElement); } + public Fault1_1Impl(SOAPDocumentImpl ownerDoc) { + super(ownerDoc, NameImpl.createFault1_1Name(null)); + } + + @Override protected NameImpl getDetailName() { return NameImpl.createDetail1_1Name(); } + @Override protected NameImpl getFaultCodeName() { return NameImpl.createFromUnqualifiedName("faultcode"); } + @Override protected NameImpl getFaultStringName() { return NameImpl.createFromUnqualifiedName("faultstring"); } + @Override protected NameImpl getFaultActorName() { return NameImpl.createFromUnqualifiedName("faultactor"); } + @Override protected DetailImpl createDetail() { return new Detail1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument()); } + @Override protected FaultElementImpl createSOAPFaultElement(String localName) { return new FaultElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), localName); } + @Override protected void checkIfStandardFaultCode(String faultCode, String uri) throws SOAPException { // SOAP 1.1 doesn't seem to mandate using faultcode from a particular @@ -98,16 +109,19 @@ // Also need to be backward compatible. } + @Override protected void finallySetFaultCode(String faultcode) throws SOAPException { this.faultCodeElement.addTextNode(faultcode); } + @Override public String getFaultCode() { if (this.faultCodeElement == null) findFaultCodeElement(); return this.faultCodeElement.getValue(); } + @Override public Name getFaultCodeAsName() { String faultcodeString = getFaultCode(); @@ -132,6 +146,7 @@ return NameImpl.createFromQualifiedName(faultcodeString, nsName); } + @Override public QName getFaultCodeAsQName() { String faultcodeString = getFaultCode(); if (faultcodeString == null) { @@ -142,6 +157,7 @@ return convertCodeToQName(faultcodeString, this.faultCodeElement); } + @Override public void setFaultString(String faultString) throws SOAPException { if (this.faultStringElement == null) @@ -158,6 +174,7 @@ this.faultStringElement.addTextNode(faultString); } + @Override public String getFaultString() { if (this.faultStringElement == null) findFaultStringElement(); @@ -165,6 +182,7 @@ } + @Override public Locale getFaultStringLocale() { if (this.faultStringElement == null) findFaultStringElement(); @@ -178,6 +196,7 @@ return null; } + @Override public void setFaultString(String faultString, Locale locale) throws SOAPException { setFaultString(faultString); @@ -186,6 +205,7 @@ localeToXmlLang(locale)); } + @Override protected boolean isStandardFaultElement(String localName) { if (localName.equalsIgnoreCase("detail") || localName.equalsIgnoreCase("faultcode") || @@ -196,6 +216,7 @@ return false; } + @Override public void appendFaultSubcode(QName subcode) { log.log( Level.SEVERE, @@ -204,6 +225,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public void removeAllFaultSubcodes() { log.log( Level.SEVERE, @@ -212,7 +234,8 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } - public Iterator getFaultSubcodes() { + @Override + public Iterator<QName> getFaultSubcodes() { log.log( Level.SEVERE, "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", @@ -220,6 +243,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public String getFaultReasonText(Locale locale) { log.log( Level.SEVERE, @@ -228,7 +252,8 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } - public Iterator getFaultReasonTexts() { + @Override + public Iterator<String> getFaultReasonTexts() { log.log( Level.SEVERE, "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", @@ -236,7 +261,8 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } - public Iterator getFaultReasonLocales() { + @Override + public Iterator<Locale> getFaultReasonLocales() { log.log( Level.SEVERE, "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1", @@ -244,6 +270,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public void addFaultReasonText(String text, java.util.Locale locale) throws SOAPException { log.log( @@ -253,6 +280,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public String getFaultRole() { log.log( Level.SEVERE, @@ -261,6 +289,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public void setFaultRole(String uri) { log.log( Level.SEVERE, @@ -269,6 +298,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public String getFaultNode() { log.log( Level.SEVERE, @@ -277,6 +307,7 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override public void setFaultNode(String uri) { log.log( Level.SEVERE, @@ -285,10 +316,12 @@ throw new UnsupportedOperationException("Not supported in SOAP 1.1"); } + @Override protected QName getDefaultFaultCode() { return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server"); } + @Override public SOAPElement addChildElement(SOAPElement element) throws SOAPException { String localName = element.getLocalName(); @@ -301,18 +334,21 @@ return super.addChildElement(element); } + @Override protected FaultElementImpl createSOAPFaultElement(QName qname) { return new FaultElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), qname); } + @Override protected FaultElementImpl createSOAPFaultElement(Name qname) { return new FaultElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), (NameImpl)qname); } + @Override public void setFaultCode(String faultCode, String prefix, String uri) throws SOAPException { if (prefix == null || "".equals(prefix)) { @@ -370,6 +406,7 @@ return false; } + @Override public void setFaultActor(String faultActor) throws SOAPException { if (this.faultActorElement == null) findFaultActorElement();
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/FaultElement1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/FaultElement1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -59,6 +59,7 @@ NameImpl.createFaultElement1_1Name(localName, prefix)); } + @Override protected boolean isStandardFaultElement() { String localName = elementQName.getLocalPart(); if (localName.equalsIgnoreCase("faultcode") || @@ -69,6 +70,7 @@ return false; } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { if (!isStandardFaultElement()) { FaultElement1_1Impl copy =
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Header1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Header1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -56,6 +56,7 @@ super(ownerDoc, domElement); } + @Override protected NameImpl getNotUnderstoodName() { log.log( Level.SEVERE, @@ -64,6 +65,7 @@ throw new UnsupportedOperationException("Not supported by SOAP 1.1"); } + @Override protected NameImpl getUpgradeName() { return NameImpl.create( "Upgrade", @@ -71,6 +73,7 @@ SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE); } + @Override protected NameImpl getSupportedEnvelopeName() { return NameImpl.create( "SupportedEnvelope", @@ -78,6 +81,7 @@ SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE); } + @Override public SOAPHeaderElement addNotUnderstoodHeaderElement(QName name) throws SOAPException { log.log( @@ -87,11 +91,13 @@ throw new UnsupportedOperationException("Not supported by SOAP 1.1"); } + @Override protected SOAPHeaderElement createHeaderElement(Name name) { return new HeaderElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected SOAPHeaderElement createHeaderElement(QName name) { return new HeaderElement1_1Impl( ((SOAPDocument) getOwnerDocument()).getDocument(),
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/HeaderElement1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/HeaderElement1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -41,6 +41,7 @@ import com.sun.xml.internal.messaging.saaj.soap.impl.HeaderElementImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import org.w3c.dom.Element; public class HeaderElement1_1Impl extends HeaderElementImpl { @@ -55,17 +56,24 @@ super(ownerDoc, qname); } + public HeaderElement1_1Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { HeaderElementImpl copy = new HeaderElement1_1Impl((SOAPDocumentImpl) getOwnerDocument(), newName); return replaceElementWithSOAPElement(this,copy); } + @Override protected NameImpl getActorAttributeName() { return NameImpl.create("actor", null, NameImpl.SOAP11_NAMESPACE); } // role not supported by SOAP 1.1 + @Override protected NameImpl getRoleAttributeName() { log.log( Level.SEVERE, @@ -74,15 +82,18 @@ throw new UnsupportedOperationException("Role not supported by SOAP 1.1"); } + @Override protected NameImpl getMustunderstandAttributeName() { return NameImpl.create("mustUnderstand", null, NameImpl.SOAP11_NAMESPACE); } // mustUnderstand attribute has literal value "1" or "0" + @Override protected String getMustunderstandLiteralValue(boolean mustUnderstand) { return (mustUnderstand == true ? "1" : "0"); } + @Override protected boolean getMustunderstandAttributeValue(String mu) { if ("1".equals(mu) || "true".equalsIgnoreCase(mu)) return true; @@ -90,6 +101,7 @@ } // relay not supported by SOAP 1.1 + @Override protected NameImpl getRelayAttributeName() { log.log( Level.SEVERE, @@ -98,6 +110,7 @@ throw new UnsupportedOperationException("Relay not supported by SOAP 1.1"); } + @Override protected String getRelayLiteralValue(boolean relayAttr) { log.log( Level.SEVERE, @@ -106,6 +119,7 @@ throw new UnsupportedOperationException("Relay not supported by SOAP 1.1"); } + @Override protected boolean getRelayAttributeValue(String mu) { log.log( Level.SEVERE, @@ -114,6 +128,7 @@ throw new UnsupportedOperationException("Relay not supported by SOAP 1.1"); } + @Override protected String getActorOrRole() { return getActor(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Message1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/Message1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -76,6 +76,7 @@ super(headers,ct,stat,reader); } + @Override public SOAPPart getSOAPPart() { if (soapPartImpl == null) { soapPartImpl = new SOAPPart1_1Impl(this); @@ -83,10 +84,12 @@ return soapPartImpl; } + @Override protected boolean isCorrectSoapVersion(int contentTypeId) { return (contentTypeId & SOAP1_1_FLAG) != 0; } + @Override public String getAction() { log.log( Level.SEVERE, @@ -95,6 +98,7 @@ throw new UnsupportedOperationException("Operation not supported by SOAP 1.1"); } + @Override public void setAction(String type) { log.log( Level.SEVERE, @@ -103,6 +107,7 @@ throw new UnsupportedOperationException("Operation not supported by SOAP 1.1"); } + @Override public String getCharset() { log.log( Level.SEVERE, @@ -111,6 +116,7 @@ throw new UnsupportedOperationException("Operation not supported by SOAP 1.1"); } + @Override public void setCharset(String charset) { log.log( Level.SEVERE, @@ -119,10 +125,12 @@ throw new UnsupportedOperationException("Operation not supported by SOAP 1.1"); } + @Override protected String getExpectedContentType() { return isFastInfoset ? "application/fastinfoset" : "text/xml"; } + @Override protected String getExpectedAcceptHeader() { String accept = "text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"; return acceptFastInfoset ? ("application/fastinfoset, " + accept) : accept;
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPFactory1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPFactory1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -39,14 +39,17 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPFactoryImpl; public class SOAPFactory1_1Impl extends SOAPFactoryImpl { + @Override protected SOAPDocumentImpl createDocument() { return (new SOAPPart1_1Impl()).getDocument(); } + @Override public Detail createDetail() throws SOAPException { return new Detail1_1Impl(createDocument()); } + @Override public SOAPFault createFault(String reasonText, QName faultCode) throws SOAPException { if (faultCode == null) { @@ -55,14 +58,15 @@ if (reasonText == null) { throw new IllegalArgumentException("reasonText argument for createFault was passed NULL"); } - Fault1_1Impl fault = new Fault1_1Impl(createDocument(), null); + Fault1_1Impl fault = new Fault1_1Impl(createDocument()); fault.setFaultCode(faultCode); fault.setFaultString(reasonText); return fault; } + @Override public SOAPFault createFault() throws SOAPException { - Fault1_1Impl fault = new Fault1_1Impl(createDocument(), null); + Fault1_1Impl fault = new Fault1_1Impl(createDocument()); fault.setFaultCode(fault.getDefaultFaultCode()); fault.setFaultString("Fault string, and possibly fault code, not set"); return fault;
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPMessageFactory1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPMessageFactory1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -40,16 +40,19 @@ public class SOAPMessageFactory1_1Impl extends MessageFactoryImpl { + @Override public SOAPMessage createMessage() throws SOAPException { return new Message1_1Impl(); } + @Override public SOAPMessage createMessage(boolean isFastInfoset, boolean acceptFastInfoset) throws SOAPException { return new Message1_1Impl(isFastInfoset, acceptFastInfoset); } + @Override public SOAPMessage createMessage(MimeHeaders headers, InputStream in) throws IOException, SOAPExceptionImpl { if (headers == null) {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPPart1_1Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_1/SOAPPart1_1Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -54,10 +54,12 @@ super(message); } + @Override protected String getContentType() { return isFastInfoset() ? "application/fastinfoset" : "text/xml"; } + @Override protected Envelope createEnvelopeFromSource() throws SOAPException { // Record the presence of xml declaration before the envelope gets // created. @@ -80,11 +82,13 @@ return envelope; } + @Override protected Envelope createEmptyEnvelope(String prefix) throws SOAPException { return new Envelope1_1Impl(getDocument(), prefix, true, true); } + @Override protected SOAPPartImpl duplicateType() { return new SOAPPart1_1Impl(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Body1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Body1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -57,25 +57,30 @@ super(ownerDoc, domElement); } + @Override protected NameImpl getFaultName(String name) { return NameImpl.createFault1_2Name(name, null); } + @Override protected SOAPBodyElement createBodyElement(Name name) { return new BodyElement1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected SOAPBodyElement createBodyElement(QName name) { return new BodyElement1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected QName getDefaultFaultCode() { return SOAPConstants.SOAP_RECEIVER_FAULT; } + @Override public SOAPFault addFault() throws SOAPException { if (hasAnyChildElement()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -89,6 +94,7 @@ * Override setEncodingStyle of ElementImpl to restrict adding encodingStyle * attribute to SOAP Body (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0401.ver1_2.no.encodingstyle.in.body"); throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on Body"); @@ -98,6 +104,7 @@ * Override addAttribute of ElementImpl to restrict adding encodingStyle * attribute to SOAP Body (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -108,6 +115,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle") @@ -118,6 +126,7 @@ return super.addAttribute(name, value); } + @Override protected boolean isFault(SOAPElement child) { return (child.getElementName().getURI().equals( SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE) && @@ -125,6 +134,7 @@ "Fault")); } + @Override protected SOAPFault createFaultElement() { return new Fault1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), getPrefix()); @@ -135,6 +145,7 @@ * SOAP message MUST contain a single Fault element as the only * child element of the SOAP Body. */ + @Override public SOAPBodyElement addBodyElement(Name name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -144,6 +155,7 @@ return super.addBodyElement(name); } + @Override public SOAPBodyElement addBodyElement(QName name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -153,6 +165,7 @@ return super.addBodyElement(name); } + @Override protected SOAPElement addElement(Name name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -162,6 +175,7 @@ return super.addElement(name); } + @Override protected SOAPElement addElement(QName name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -171,6 +185,7 @@ return super.addElement(name); } + @Override public SOAPElement addChildElement(Name name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body"); @@ -180,6 +195,7 @@ return super.addChildElement(name); } + @Override public SOAPElement addChildElement(QName name) throws SOAPException { if (hasFault()) { log.severe("SAAJ0402.ver1_2.only.fault.allowed.in.body");
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/BodyElement1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/BodyElement1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -36,6 +36,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.BodyElementImpl; +import org.w3c.dom.Element; public class BodyElement1_2Impl extends BodyElementImpl { @@ -47,6 +48,11 @@ super(ownerDoc, qname); } + public BodyElement1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { BodyElementImpl copy = new BodyElement1_2Impl((SOAPDocumentImpl) getOwnerDocument(), newName);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Detail1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Detail1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -59,12 +59,14 @@ super(ownerDoc, domElement); } + @Override protected DetailEntry createDetailEntry(Name name) { return new DetailEntry1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), name); } + @Override protected DetailEntry createDetailEntry(QName name) { return new DetailEntry1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), @@ -75,11 +77,13 @@ * Override setEncodingStyle of ElementImpl to restrict adding encodingStyle * attribute to SOAP Detail (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0403.ver1_2.no.encodingStyle.in.detail"); throw new SOAPExceptionImpl("EncodingStyle attribute cannot appear in Detail"); } + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -89,6 +93,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle")
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/DetailEntry1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/DetailEntry1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -36,6 +36,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.DetailEntryImpl; +import org.w3c.dom.Element; public class DetailEntry1_2Impl extends DetailEntryImpl { @@ -47,6 +48,11 @@ super(ownerDoc, qname); } + public DetailEntry1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { DetailEntryImpl copy = new DetailEntry1_2Impl((SOAPDocumentImpl) getOwnerDocument(), newName);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Envelope1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Envelope1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -68,10 +68,12 @@ createBody); } + @Override protected NameImpl getBodyName(String prefix) { return NameImpl.createBody1_2Name(prefix); } + @Override protected NameImpl getHeaderName(String prefix) { return NameImpl.createHeader1_2Name(prefix); } @@ -80,6 +82,7 @@ * Override setEncodingStyle of ElementImpl to restrict adding encodingStyle * attribute to SOAP Envelope (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0404.ver1_2.no.encodingStyle.in.envelope"); throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on Envelope"); @@ -89,6 +92,7 @@ * Override addAttribute of ElementImpl to restrict adding encodingStyle * attribute to SOAP Envelope (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -98,6 +102,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle") @@ -112,6 +117,7 @@ * Override addChildElement method to ensure that no element * is added after body in SOAP 1.2. */ + @Override public SOAPElement addChildElement(Name name) throws SOAPException { // check if body already exists if (getBody() != null) { @@ -122,6 +128,7 @@ return super.addChildElement(name); } + @Override public SOAPElement addChildElement(QName name) throws SOAPException { // check if body already exists if (getBody() != null) { @@ -142,6 +149,7 @@ * */ + @Override public SOAPElement addTextNode(String text) throws SOAPException { log.log( Level.SEVERE,
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Fault1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Fault1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -29,12 +29,10 @@ */ package com.sun.xml.internal.messaging.saaj.soap.ver1_2; -import java.util.*; import java.util.logging.Logger; import java.util.logging.Level; import javax.xml.namespace.QName; -import javax.xml.soap.*; import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument; @@ -42,6 +40,14 @@ import com.sun.xml.internal.messaging.saaj.soap.impl.*; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; import org.w3c.dom.Element; @@ -69,22 +75,30 @@ super(ownerDocument, NameImpl.createFault1_2Name(null, prefix)); } - public Fault1_2Impl(Element domElement, SOAPDocumentImpl ownerDoc) { + public Fault1_2Impl(SOAPDocumentImpl ownerDocument) { + super(ownerDocument, NameImpl.createFault1_2Name(null, null)); + } + + public Fault1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) { super(ownerDoc, domElement); } + @Override protected NameImpl getDetailName() { return NameImpl.createSOAP12Name("Detail", getPrefix()); } + @Override protected NameImpl getFaultCodeName() { return NameImpl.createSOAP12Name("Code", getPrefix()); } + @Override protected NameImpl getFaultStringName() { return getFaultReasonName(); } + @Override protected NameImpl getFaultActorName() { return getFaultRoleName(); } @@ -109,17 +123,20 @@ return NameImpl.createXmlName("lang"); } + @Override protected DetailImpl createDetail() { return new Detail1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument()); } + @Override protected FaultElementImpl createSOAPFaultElement(String localName) { return new FaultElement1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), localName); } + @Override protected void checkIfStandardFaultCode(String faultCode, String uri) throws SOAPException { QName qname = new QName(uri, faultCode); @@ -136,6 +153,7 @@ throw new SOAPExceptionImpl(qname + " is not a standard Code value"); } + @Override protected void finallySetFaultCode(String faultcode) throws SOAPException { SOAPElement value = this.faultCodeElement.addChildElement(valueName); value.addTextNode(faultcode); @@ -145,13 +163,14 @@ findFaultStringElement(); } - public Iterator getFaultReasonTexts() throws SOAPException { + @Override + public Iterator<String> getFaultReasonTexts() throws SOAPException { // Fault Reason has similar semantics as faultstring if (this.faultStringElement == null) findReasonElement(); Iterator eachTextElement = this.faultStringElement.getChildElements(textName); - List<String> texts = new ArrayList<String>(); + List<String> texts = new ArrayList<>(); while (eachTextElement.hasNext()) { SOAPElement textElement = (SOAPElement) eachTextElement.next(); Locale thisLocale = getLocale(textElement); @@ -168,6 +187,7 @@ return texts.iterator(); } + @Override public void addFaultReasonText(String text, java.util.Locale locale) throws SOAPException { @@ -214,6 +234,7 @@ } } + @Override public String getFaultReasonText(Locale locale) throws SOAPException { if (locale == null) @@ -234,13 +255,14 @@ return null; } - public Iterator getFaultReasonLocales() throws SOAPException { + @Override + public Iterator<Locale> getFaultReasonLocales() throws SOAPException { // Fault Reason has similar semantics as faultstring if (this.faultStringElement == null) findReasonElement(); Iterator eachTextElement = this.faultStringElement.getChildElements(textName); - List<Locale> localeSet = new ArrayList<Locale>(); + List<Locale> localeSet = new ArrayList<>(); while (eachTextElement.hasNext()) { SOAPElement textElement = (SOAPElement) eachTextElement.next(); Locale thisLocale = getLocale(textElement); @@ -257,6 +279,7 @@ return localeSet.iterator(); } + @Override public Locale getFaultStringLocale() { Locale locale = null; try { @@ -288,6 +311,7 @@ return null; } + @Override public String getFaultNode() { SOAPElement faultNode = findAndConvertChildElement(getFaultNodeName()); if (faultNode == null) { @@ -296,6 +320,7 @@ return faultNode.getValue(); } + @Override public void setFaultNode(String uri) throws SOAPException { SOAPElement faultNode = findAndConvertChildElement(getFaultNodeName()); if (faultNode != null) { @@ -314,10 +339,12 @@ addNode(faultNode); } + @Override public String getFaultRole() { return getFaultActor(); } + @Override public void setFaultRole(String uri) throws SOAPException { if (this.faultActorElement == null) findFaultActorElement(); @@ -333,6 +360,7 @@ addNode(this.faultActorElement); } + @Override public String getFaultCode() { if (this.faultCodeElement == null) findFaultCodeElement(); @@ -341,6 +369,7 @@ return ((SOAPElement) codeValues.next()).getValue(); } + @Override public QName getFaultCodeAsQName() { String faultcode = getFaultCode(); if (faultcode == null) { @@ -355,6 +384,7 @@ (SOAPElement) valueElements.next()); } + @Override public Name getFaultCodeAsName() { String faultcode = getFaultCode(); if (faultcode == null) { @@ -370,6 +400,7 @@ (SOAPElement) valueElements.next())); } + @Override public String getFaultString() { String reason = null; try { @@ -380,10 +411,12 @@ return reason; } + @Override public void setFaultString(String faultString) throws SOAPException { addFaultReasonText(faultString, Locale.getDefault()); } + @Override public void setFaultString( String faultString, Locale locale) @@ -391,6 +424,7 @@ addFaultReasonText(faultString, locale); } + @Override public void appendFaultSubcode(QName subcode) throws SOAPException { if (subcode == null) { return; @@ -426,6 +460,7 @@ subcodeValueElement.addTextNode(prefix + ":" + subcode.getLocalPart()); } + @Override public void removeAllFaultSubcodes() { if (this.faultCodeElement == null) findFaultCodeElement(); @@ -437,10 +472,11 @@ } } - public Iterator getFaultSubcodes() { + @Override + public Iterator<QName> getFaultSubcodes() { if (this.faultCodeElement == null) findFaultCodeElement(); - final List<QName> subcodeList = new ArrayList<QName>(); + final List<QName> subcodeList = new ArrayList<>(); SOAPElement currentCodeElement = this.faultCodeElement; Iterator subcodeElements = currentCodeElement.getChildElements(subcodeName); @@ -457,14 +493,17 @@ return new Iterator<QName>() { Iterator<QName> subCodeIter = subcodeList.iterator(); + @Override public boolean hasNext() { return subCodeIter.hasNext(); } + @Override public QName next() { return subCodeIter.next(); } + @Override public void remove() { throw new UnsupportedOperationException( "Method remove() not supported on SubCodes Iterator"); @@ -480,11 +519,13 @@ * Override setEncodingStyle of ElementImpl to restrict adding encodingStyle * attribute to SOAP Fault (SOAP 1.2 spec, part 1, section 5.1.1) */ + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0407.ver1_2.no.encodingStyle.in.fault"); throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on Fault"); } + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -494,6 +535,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle") @@ -503,6 +545,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addTextNode(String text) throws SOAPException { log.log( Level.SEVERE, @@ -511,6 +554,7 @@ throw new SOAPExceptionImpl("Adding text to SOAP 1.2 Fault is not legal"); } + @Override public SOAPElement addChildElement(SOAPElement element) throws SOAPException { String localName = element.getLocalName(); @@ -533,6 +577,7 @@ return super.addChildElement(element); } + @Override protected boolean isStandardFaultElement(String localName) { if (localName.equalsIgnoreCase("code") || localName.equalsIgnoreCase("reason") || @@ -544,22 +589,26 @@ return false; } + @Override protected QName getDefaultFaultCode() { return SOAPConstants.SOAP_SENDER_FAULT; } + @Override protected FaultElementImpl createSOAPFaultElement(QName qname) { return new FaultElement1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), qname); } + @Override protected FaultElementImpl createSOAPFaultElement(Name qname) { return new FaultElement1_2Impl( ((SOAPDocument) getOwnerDocument()).getDocument(), (NameImpl)qname); } + @Override public void setFaultActor(String faultActor) throws SOAPException { this.setFaultRole(faultActor); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/FaultElement1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/FaultElement1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -38,6 +38,7 @@ import com.sun.xml.internal.messaging.saaj.soap.impl.FaultElementImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; +import org.w3c.dom.Element; public class FaultElement1_2Impl extends FaultElementImpl { @@ -53,6 +54,11 @@ super(ownerDoc, NameImpl.createSOAP12Name(localName)); } + public FaultElement1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override protected boolean isStandardFaultElement() { String localName = elementQName.getLocalPart(); if (localName.equalsIgnoreCase("code") || @@ -64,6 +70,7 @@ return false; } + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { if (!isStandardFaultElement()) { FaultElement1_2Impl copy = @@ -74,11 +81,13 @@ } } + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0408.ver1_2.no.encodingStyle.in.fault.child"); throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on a Fault child element"); } + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -88,6 +97,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle")
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Header1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Header1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -59,18 +59,22 @@ super(ownerDoc, domElement); } + @Override protected NameImpl getNotUnderstoodName() { return NameImpl.createNotUnderstood1_2Name(null); } + @Override protected NameImpl getUpgradeName() { return NameImpl.createUpgrade1_2Name(null); } + @Override protected NameImpl getSupportedEnvelopeName() { return NameImpl.createSupportedEnvelope1_2Name(null); } + @Override public SOAPHeaderElement addNotUnderstoodHeaderElement(final QName sourceName) throws SOAPException { @@ -102,6 +106,7 @@ return notunderstoodHeaderElement; } + @Override public SOAPElement addTextNode(String text) throws SOAPException { log.log( Level.SEVERE, @@ -110,6 +115,7 @@ throw new SOAPExceptionImpl("Adding text to SOAP 1.2 Header is not legal"); } + @Override protected SOAPHeaderElement createHeaderElement(Name name) throws SOAPException { String uri = name.getURI(); @@ -122,6 +128,7 @@ name); } + @Override protected SOAPHeaderElement createHeaderElement(QName name) throws SOAPException { String uri = name.getNamespaceURI(); @@ -134,11 +141,13 @@ name); } + @Override public void setEncodingStyle(String encodingStyle) throws SOAPException { log.severe("SAAJ0409.ver1_2.no.encodingstyle.in.header"); throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on Header"); } + @Override public SOAPElement addAttribute(Name name, String value) throws SOAPException { if (name.getLocalName().equals("encodingStyle") @@ -149,6 +158,7 @@ return super.addAttribute(name, value); } + @Override public SOAPElement addAttribute(QName name, String value) throws SOAPException { if (name.getLocalPart().equals("encodingStyle")
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/HeaderElement1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/HeaderElement1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -37,6 +37,7 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; import com.sun.xml.internal.messaging.saaj.soap.impl.HeaderElementImpl; import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl; +import org.w3c.dom.Element; public class HeaderElement1_2Impl extends HeaderElementImpl { @@ -47,51 +48,65 @@ super(ownerDoc, qname); } + public HeaderElement1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) { + super(ownerDoc, domElement); + } + + @Override public SOAPElement setElementQName(QName newName) throws SOAPException { HeaderElementImpl copy = new HeaderElement1_2Impl((SOAPDocumentImpl)getOwnerDocument(), newName); return replaceElementWithSOAPElement(this,copy); } + @Override protected NameImpl getRoleAttributeName() { return NameImpl.create("role", null, NameImpl.SOAP12_NAMESPACE); } // Actor equivalent to Role in SOAP 1.2 + @Override protected NameImpl getActorAttributeName() { return getRoleAttributeName(); } + @Override protected NameImpl getMustunderstandAttributeName() { return NameImpl.create("mustUnderstand", null, NameImpl.SOAP12_NAMESPACE); } // mustUnderstand attribute has literal value "true" or "false" + @Override protected String getMustunderstandLiteralValue(boolean mustUnderstand) { return (mustUnderstand == true ? "true" : "false"); } + @Override protected boolean getMustunderstandAttributeValue(String mu) { if (mu.equals("true") || mu.equals("1")) return true; return false; } + @Override protected NameImpl getRelayAttributeName() { return NameImpl.create("relay", null, NameImpl.SOAP12_NAMESPACE); } //relay attribute has literal value "true" or "false" + @Override protected String getRelayLiteralValue(boolean relay) { return (relay == true ? "true" : "false"); } + @Override protected boolean getRelayAttributeValue(String relay) { if (relay.equals("true") || relay.equals("1")) return true; return false; } + @Override protected String getActorOrRole() { return getRole(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Message1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/Message1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -69,6 +69,7 @@ super(headers,ct,stat,reader); } + @Override public SOAPPart getSOAPPart() { if (soapPartImpl == null) soapPartImpl = new SOAPPart1_2Impl(this); @@ -76,14 +77,17 @@ return soapPartImpl; } + @Override protected boolean isCorrectSoapVersion(int contentTypeId) { return (contentTypeId & SOAP1_2_FLAG) != 0; } + @Override protected String getExpectedContentType() { return isFastInfoset ? "application/soap+fastinfoset" : "application/soap+xml"; } + @Override protected String getExpectedAcceptHeader() { String accept = "application/soap+xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"; return acceptFastInfoset ? ("application/soap+fastinfoset, " + accept) : accept;
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPFactory1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPFactory1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -39,14 +39,17 @@ import com.sun.xml.internal.messaging.saaj.soap.SOAPFactoryImpl; public class SOAPFactory1_2Impl extends SOAPFactoryImpl { + @Override protected SOAPDocumentImpl createDocument() { return (new SOAPPart1_2Impl()).getDocument(); } + @Override public Detail createDetail() throws SOAPException { return new Detail1_2Impl(createDocument()); } + @Override public SOAPFault createFault(String reasonText, QName faultCode) throws SOAPException { if (faultCode == null) { @@ -55,14 +58,15 @@ if (reasonText == null) { throw new IllegalArgumentException("reasonText argument for createFault was passed NULL"); } - Fault1_2Impl fault = new Fault1_2Impl(createDocument(), null); + Fault1_2Impl fault = new Fault1_2Impl(createDocument()); fault.setFaultCode(faultCode); fault.setFaultString(reasonText); return fault; } + @Override public SOAPFault createFault() throws SOAPException { - Fault1_2Impl fault = new Fault1_2Impl(createDocument(), null); + Fault1_2Impl fault = new Fault1_2Impl(createDocument()); fault.setFaultCode(fault.getDefaultFaultCode()); fault.setFaultString("Fault string, and possibly fault code, not set"); return fault;
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPMessageFactory1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPMessageFactory1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -40,16 +40,19 @@ public class SOAPMessageFactory1_2Impl extends MessageFactoryImpl { + @Override public SOAPMessage createMessage() throws SOAPException { return new Message1_2Impl(); } + @Override public SOAPMessage createMessage(boolean isFastInfoset, boolean acceptFastInfoset) throws SOAPException { return new Message1_2Impl(isFastInfoset, acceptFastInfoset); } + @Override public SOAPMessage createMessage(MimeHeaders headers, InputStream in) throws IOException, SOAPExceptionImpl { if (headers == null) {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPPart1_2Impl.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/ver1_2/SOAPPart1_2Impl.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -53,14 +53,17 @@ super(message); } + @Override protected String getContentType() { return "application/soap+xml"; } + @Override protected Envelope createEmptyEnvelope(String prefix) throws SOAPException { return new Envelope1_2Impl(getDocument(), prefix, true, true); } + @Override protected Envelope createEnvelopeFromSource() throws SOAPException { XMLDeclarationParser parser = lookForXmlDecl(); Source tmp = source; @@ -82,6 +85,7 @@ } + @Override protected SOAPPartImpl duplicateType() { return new SOAPPart1_2Impl(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/ByteInputStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/ByteInputStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -53,6 +53,7 @@ return count; } + @Override public void close() throws IOException { reset(); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/JAXMStreamSource.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/JAXMStreamSource.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -75,10 +75,12 @@ this.reader = new CharArrayReader(cout.toCharArray(), 0, cout.size()); } + @Override public InputStream getInputStream() { return in; } + @Override public Reader getReader() { return reader; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/NamespaceContextIterator.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/NamespaceContextIterator.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -89,11 +89,13 @@ } } + @Override public boolean hasNext() { findNext(); return next != null; } + @Override public Object next() { return getNext(); } @@ -112,6 +114,7 @@ return last; } + @Override public void remove() { if (last == null) { throw new IllegalStateException();
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/RejectDoctypeSaxFilter.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/RejectDoctypeSaxFilter.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -96,6 +96,7 @@ * Override setProperty() to capture any LexicalHandler that is set for * forwarding of events. */ + @Override public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { if (LEXICAL_HANDLER_PROP.equals(name)) { @@ -109,38 +110,45 @@ // Beginning of SAX LexicalHandler callbacks... // + @Override public void startDTD(String name, String publicId, String systemId) throws SAXException { throw new SAXException("Document Type Declaration is not allowed"); } + @Override public void endDTD() throws SAXException { } + @Override public void startEntity(String name) throws SAXException { if (lexicalHandler != null) { lexicalHandler.startEntity(name); } } + @Override public void endEntity(String name) throws SAXException { if (lexicalHandler != null) { lexicalHandler.endEntity(name); } } + @Override public void startCDATA() throws SAXException { if (lexicalHandler != null) { lexicalHandler.startCDATA(); } } + @Override public void endCDATA() throws SAXException { if (lexicalHandler != null) { lexicalHandler.endCDATA(); } } + @Override public void comment(char[] ch, int start, int length) throws SAXException { if (lexicalHandler != null) { lexicalHandler.comment(ch, start, length); @@ -151,6 +159,7 @@ // End of SAX LexicalHandler callbacks // + @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException{ if(atts != null ){
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/TeeInputStream.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/TeeInputStream.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -46,44 +46,53 @@ this.source = source; } + @Override public int read() throws IOException { int result = source.read(); copySink.write(result); return result; } + @Override public int available() throws IOException { return source.available(); } + @Override public void close() throws IOException { source.close(); } + @Override public synchronized void mark(int readlimit) { source.mark(readlimit); } + @Override public boolean markSupported() { return source.markSupported(); } + @Override public int read(byte[] b, int off, int len) throws IOException { int result = source.read(b, off, len); copySink.write(b, off, len); return result; } + @Override public int read(byte[] b) throws IOException { int result = source.read(b); copySink.write(b); return result; } + @Override public synchronized void reset() throws IOException { source.reset(); } + @Override public long skip(long n) throws IOException { return source.skip(n); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/LazyEnvelopeStaxReader.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/LazyEnvelopeStaxReader.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -59,11 +59,13 @@ } } + @Override public Object getProperty(String name) throws IllegalArgumentException { if (usePayloadReaderDelegate) return payloadReader.getProperty(name); return super.getProperty(name); } + @Override public int next() throws XMLStreamException { // boolean previouslyUsingPayloadReader = usePayloadReaderDelegate; //call checkReaderStatus to advance to payloadReader if needed @@ -78,22 +80,26 @@ return getEventType(); } + @Override public void require(int type, String namespaceURI, String localName) throws XMLStreamException { if (usePayloadReaderDelegate) payloadReader.require(type, namespaceURI, localName); else super.require(type, namespaceURI, localName); } + @Override public String getElementText() throws XMLStreamException { if (usePayloadReaderDelegate) return payloadReader.getElementText(); return super.getElementText(); } + @Override public int nextTag() throws XMLStreamException { if (usePayloadReaderDelegate) return payloadReader.nextTag(); return super.nextTag(); } + @Override public boolean hasNext() throws XMLStreamException { checkReaderStatus(false); boolean hasNext; @@ -139,116 +145,139 @@ } } + @Override public void close() throws XMLStreamException { if (usePayloadReaderDelegate) payloadReader.close(); else super.close(); } + @Override public String getNamespaceURI(String prefix) { if (usePayloadReaderDelegate) return payloadReader.getNamespaceURI(prefix); return super.getNamespaceURI(prefix); } + @Override public boolean isStartElement() { if (usePayloadReaderDelegate) return payloadReader.isStartElement(); return super.isStartElement(); } + @Override public boolean isEndElement() { if (usePayloadReaderDelegate) return payloadReader.isEndElement(); return super.isEndElement(); } + @Override public boolean isCharacters() { if (usePayloadReaderDelegate) return payloadReader.isCharacters(); return super.isEndElement(); } + @Override public boolean isWhiteSpace() { if (usePayloadReaderDelegate) return payloadReader.isWhiteSpace(); return super.isWhiteSpace(); } + @Override public String getAttributeValue(String namespaceURI, String localName) { if (usePayloadReaderDelegate) return payloadReader.getAttributeValue(namespaceURI, localName); return super.getAttributeValue(namespaceURI, localName); } + @Override public int getAttributeCount() { if (usePayloadReaderDelegate) return payloadReader.getAttributeCount(); return super.getAttributeCount(); } + @Override public QName getAttributeName(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributeName(index); return super.getAttributeName(index); } + @Override public String getAttributeNamespace(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributeNamespace(index); return super.getAttributeNamespace(index); } + @Override public String getAttributeLocalName(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributeLocalName(index); return super.getAttributeLocalName(index); } + @Override public String getAttributePrefix(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributePrefix(index); return super.getAttributePrefix(index); } + @Override public String getAttributeType(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributeType(index); return super.getAttributeType(index); } + @Override public String getAttributeValue(int index) { if (usePayloadReaderDelegate) return payloadReader.getAttributeValue(index); return super.getAttributeValue(index); } + @Override public boolean isAttributeSpecified(int index) { if (usePayloadReaderDelegate) return payloadReader.isAttributeSpecified(index); return super.isAttributeSpecified(index); } + @Override public int getNamespaceCount() { if (usePayloadReaderDelegate) return payloadReader.getNamespaceCount(); return super.getNamespaceCount(); } + @Override public String getNamespacePrefix(int index) { if (usePayloadReaderDelegate) return payloadReader.getNamespacePrefix(index); return super.getNamespacePrefix(index); } + @Override public String getNamespaceURI(int index) { if (usePayloadReaderDelegate) return payloadReader.getNamespaceURI(index); return super.getNamespaceURI(index); } + @Override public NamespaceContext getNamespaceContext() { if (usePayloadReaderDelegate) return payloadReader.getNamespaceContext(); return super.getNamespaceContext(); } + @Override public int getEventType() { if (usePayloadReaderDelegate) return payloadReader.getEventType(); return super.getEventType(); } + @Override public String getText() { if (usePayloadReaderDelegate) return payloadReader.getText(); return super.getText(); } + @Override public char[] getTextCharacters() { if (usePayloadReaderDelegate) return payloadReader.getTextCharacters(); return super.getTextCharacters(); } + @Override public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException { if (usePayloadReaderDelegate) return payloadReader.getTextCharacters(sourceStart, target, targetStart, @@ -256,81 +285,97 @@ return super.getTextCharacters(sourceStart, target, targetStart, length); } + @Override public int getTextStart() { if (usePayloadReaderDelegate) return payloadReader.getTextStart(); return super.getTextStart(); } + @Override public int getTextLength() { if (usePayloadReaderDelegate) return payloadReader.getTextLength(); return super.getTextLength(); } + @Override public String getEncoding() { if (usePayloadReaderDelegate) return payloadReader.getEncoding(); return super.getEncoding(); } + @Override public boolean hasText() { if (usePayloadReaderDelegate) return payloadReader.hasText(); return super.hasText(); } + @Override public Location getLocation() { if (usePayloadReaderDelegate) return payloadReader.getLocation(); return super.getLocation(); } + @Override public QName getName() { if (usePayloadReaderDelegate) return payloadReader.getName(); return super.getName(); } + @Override public String getLocalName() { if (usePayloadReaderDelegate) return payloadReader.getLocalName(); return super.getLocalName(); } + @Override public boolean hasName() { if (usePayloadReaderDelegate) return payloadReader.hasName(); return super.hasName(); } + @Override public String getNamespaceURI() { if (usePayloadReaderDelegate) return payloadReader.getNamespaceURI(); return super.getNamespaceURI(); } + @Override public String getPrefix() { if (usePayloadReaderDelegate) return payloadReader.getPrefix(); return super.getPrefix(); } + @Override public String getVersion() { if (usePayloadReaderDelegate) return payloadReader.getVersion(); return super.getVersion(); } + @Override public boolean isStandalone() { if (usePayloadReaderDelegate) return payloadReader.isStandalone(); return super.isStandalone(); } + @Override public boolean standaloneSet() { if (usePayloadReaderDelegate) return payloadReader.standaloneSet(); return super.standaloneSet(); } + @Override public String getCharacterEncodingScheme() { if (usePayloadReaderDelegate) return payloadReader.getCharacterEncodingScheme(); return super.getCharacterEncodingScheme(); } + @Override public String getPITarget() { if (usePayloadReaderDelegate) return payloadReader.getPITarget(); return super.getPITarget(); } + @Override public String getPIData() { if (usePayloadReaderDelegate) return payloadReader.getPIData(); return super.getPIData();
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java Mon Jul 10 15:54:38 2017 +0200 @@ -335,24 +335,30 @@ @Override public NamespaceContext getNamespaceContext() { return new NamespaceContext() { + @Override public String getNamespaceURI(final String prefix) { return currentElement.getNamespaceURI(prefix); } + @Override public String getPrefix(final String namespaceURI) { return currentElement.lookupPrefix(namespaceURI); } + @Override public Iterator getPrefixes(final String namespaceURI) { return new Iterator<String>() { String prefix = getPrefix(namespaceURI); + @Override public boolean hasNext() { return (prefix != null); } + @Override public String next() { if (!hasNext()) throw new java.util.NoSuchElementException(); String next = prefix; prefix = null; return next; } + @Override public void remove() {} }; }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriterEx.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriterEx.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, 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 @@ -67,6 +67,7 @@ super(msg, uri); } + @Override public void writeStartElement(String prefix, String ln, String ns) throws XMLStreamException { if (xopNS.equals(ns) && Include.equals(ln)) { state = State.xopInclude; @@ -108,31 +109,41 @@ @Override public NamespaceContextEx getNamespaceContext() { return new NamespaceContextEx() { + @Override public String getNamespaceURI(String prefix) { return currentElement.getNamespaceURI(prefix); } + @Override public String getPrefix(String namespaceURI) { return currentElement.lookupPrefix(namespaceURI); } + @Override public Iterator getPrefixes(final String namespaceURI) { return new Iterator<String>() { String prefix = getPrefix(namespaceURI); + @Override public boolean hasNext() { return (prefix != null); } + @Override public String next() { if (prefix == null) throw new java.util.NoSuchElementException(); String next = prefix; prefix = null; return next; } + @Override public void remove() {} }; } + @Override public Iterator<Binding> iterator() { return new Iterator<Binding>() { + @Override public boolean hasNext() { return false; } + @Override public Binding next() { return null; } + @Override public void remove() {} }; } @@ -208,6 +219,7 @@ return hrefOrCid; } + @Override public AttachmentMarshaller getAttachmentMarshaller() { return new AttachmentMarshaller() { @Override
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SAAJMessageHeaders.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SAAJMessageHeaders.java Mon Jul 10 15:54:38 2017 +0200 @@ -25,6 +25,18 @@ package com.sun.xml.internal.ws.api.message.saaj; +import com.sun.xml.internal.ws.api.SOAPVersion; +import com.sun.xml.internal.ws.api.WSBinding; +import com.sun.xml.internal.ws.api.message.Header; +import com.sun.xml.internal.ws.api.message.MessageHeaders; +import com.sun.xml.internal.ws.binding.SOAPBindingImpl; +import com.sun.xml.internal.ws.message.saaj.SAAJHeader; + +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; +import javax.xml.soap.SOAPMessage; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -34,21 +46,6 @@ import java.util.Map; import java.util.Set; -import javax.xml.namespace.QName; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPHeader; -import javax.xml.soap.SOAPHeaderElement; -import javax.xml.soap.SOAPMessage; - -import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl; -import com.sun.xml.internal.messaging.saaj.soap.impl.HeaderImpl; -import com.sun.xml.internal.ws.api.SOAPVersion; -import com.sun.xml.internal.ws.api.WSBinding; -import com.sun.xml.internal.ws.api.message.Header; -import com.sun.xml.internal.ws.api.message.MessageHeaders; -import com.sun.xml.internal.ws.binding.SOAPBindingImpl; -import com.sun.xml.internal.ws.message.saaj.SAAJHeader; - public class SAAJMessageHeaders implements MessageHeaders { SOAPMessage sm; Map<SOAPHeaderElement, Header> nonSAAJHeaders; @@ -236,12 +233,11 @@ if (soapHeader == null) { return null; } - SOAPDocumentImpl soapDocument = ((HeaderImpl)soapHeader).getSoapDocument(); SOAPHeaderElement headerElem = find(nsUri, localName); if (headerElem == null) { return null; } - headerElem = (SOAPHeaderElement) soapDocument.find(soapHeader.removeChild(headerElem)); + headerElem = (SOAPHeaderElement) soapHeader.removeChild(headerElem); //it might have been a nonSAAJHeader - remove from that map removeNonSAAJHeader(headerElem);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/server/SDDocumentSource.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/server/SDDocumentSource.java Mon Jul 10 15:54:38 2017 +0200 @@ -35,6 +35,7 @@ import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; @@ -89,8 +90,14 @@ */ public abstract URL getSystemId(); - public static SDDocumentSource create(final Class<?> implClass, final String url) { - return create(url, implClass); + public static SDDocumentSource create(final Class<?> implClass, final String wsdlLocation) { + ClassLoader cl = implClass.getClassLoader(); + URL url = cl.getResource(wsdlLocation); + if (url != null) { + return create(url); + } else { + return create(wsdlLocation, implClass); + } } /**
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -28,6 +28,7 @@ import com.sun.istack.internal.NotNull; import com.sun.istack.internal.Nullable; import com.sun.xml.internal.ws.streaming.XMLReaderException; +import com.sun.xml.internal.ws.util.MrJarUtil; import com.sun.xml.internal.ws.util.xml.XmlUtil; import org.xml.sax.InputSource; @@ -79,7 +80,7 @@ // this system property can be used to disable the pooling altogether, // in case someone hits an issue with pooling in the production system. - if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool")) { + if(!MrJarUtil.getNoPoolProperty(XMLStreamReaderFactory.class.getName())) { f = Zephyr.newInstance(xif); }
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, 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 @@ -30,6 +30,7 @@ import com.sun.xml.internal.ws.encoding.HasEncoding; import com.sun.xml.internal.ws.encoding.SOAPBindingCodec; import com.sun.xml.internal.ws.streaming.XMLReaderException; +import com.sun.xml.internal.ws.util.MrJarUtil; import com.sun.xml.internal.ws.util.xml.XMLStreamWriterFilter; import javax.xml.stream.XMLOutputFactory; @@ -85,7 +86,7 @@ // this system property can be used to disable the pooling altogether, // in case someone hits an issue with pooling in the production system. - if (!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool")) { + if (!MrJarUtil.getNoPoolProperty(XMLStreamWriterFactory.class.getName())) { try { Class<?> clazz = xof.createXMLStreamWriter(new StringWriter()).getClass(); if (clazz.getName().startsWith("com.sun.xml.internal.stream.")) {
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/model/RuntimeModeler.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/model/RuntimeModeler.java Mon Jul 10 15:54:38 2017 +0200 @@ -1180,7 +1180,7 @@ if(p == null) resRpcParams.put(resRpcParams.size()+10000, param); else - resRpcParams.put(param.getIndex(), param); + resRpcParams.put(p.getIndex(), param); } }else{ javaMethod.addParameter(param);
--- a/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/policy/privateutil/LocalizationMessages.java Wed Jun 14 11:19:42 2017 +0200 +++ b/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/policy/privateutil/LocalizationMessages.java Mon Jul 10 15:54:38 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.