src/share/jaxws_classes/com/sun/xml/internal/ws/message/jaxb/JAXBHeader.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 397
b99d7e355d4b
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.xml.internal.ws.message.jaxb;
aoqi@0 27
aoqi@0 28 import com.sun.istack.internal.NotNull;
aoqi@0 29 import com.sun.istack.internal.XMLStreamException2;
aoqi@0 30 import com.sun.xml.internal.bind.api.Bridge;
aoqi@0 31 import com.sun.xml.internal.stream.buffer.MutableXMLStreamBuffer;
aoqi@0 32 import com.sun.xml.internal.stream.buffer.XMLStreamBuffer;
aoqi@0 33 import com.sun.xml.internal.stream.buffer.XMLStreamBufferResult;
aoqi@0 34 import com.sun.xml.internal.ws.api.message.Header;
aoqi@0 35 import com.sun.xml.internal.ws.encoding.SOAPBindingCodec;
aoqi@0 36 import com.sun.xml.internal.ws.message.AbstractHeaderImpl;
aoqi@0 37 import com.sun.xml.internal.ws.message.RootElementSniffer;
aoqi@0 38 import com.sun.xml.internal.ws.spi.db.BindingContext;
aoqi@0 39 import com.sun.xml.internal.ws.spi.db.XMLBridge;
aoqi@0 40 import com.sun.xml.internal.ws.streaming.XMLStreamWriterUtil;
aoqi@0 41 import org.xml.sax.Attributes;
aoqi@0 42 import org.xml.sax.ContentHandler;
aoqi@0 43 import org.xml.sax.ErrorHandler;
aoqi@0 44 import org.xml.sax.SAXException;
aoqi@0 45 import org.xml.sax.SAXParseException;
aoqi@0 46
aoqi@0 47 import javax.xml.bind.JAXBElement;
aoqi@0 48 import javax.xml.bind.JAXBException;
aoqi@0 49 import javax.xml.bind.Unmarshaller;
aoqi@0 50 import javax.xml.bind.util.JAXBResult;
aoqi@0 51 import javax.xml.namespace.QName;
aoqi@0 52 import javax.xml.soap.SOAPException;
aoqi@0 53 import javax.xml.soap.SOAPMessage;
aoqi@0 54 import javax.xml.soap.SOAPHeader;
aoqi@0 55 import javax.xml.stream.XMLStreamException;
aoqi@0 56 import javax.xml.stream.XMLStreamReader;
aoqi@0 57 import javax.xml.stream.XMLStreamWriter;
aoqi@0 58 import java.io.OutputStream;
aoqi@0 59
aoqi@0 60 /**
aoqi@0 61 * {@link Header} whose physical data representation is a JAXB bean.
aoqi@0 62 *
aoqi@0 63 * @author Kohsuke Kawaguchi
aoqi@0 64 */
aoqi@0 65 public final class JAXBHeader extends AbstractHeaderImpl {
aoqi@0 66
aoqi@0 67 /**
aoqi@0 68 * The JAXB object that represents the header.
aoqi@0 69 */
aoqi@0 70 private final Object jaxbObject;
aoqi@0 71
aoqi@0 72 private final XMLBridge bridge;
aoqi@0 73
aoqi@0 74 // information about this header. lazily obtained.
aoqi@0 75 private String nsUri;
aoqi@0 76 private String localName;
aoqi@0 77 private Attributes atts;
aoqi@0 78
aoqi@0 79 /**
aoqi@0 80 * Once the header is turned into infoset,
aoqi@0 81 * this buffer keeps it.
aoqi@0 82 */
aoqi@0 83 private XMLStreamBuffer infoset;
aoqi@0 84
aoqi@0 85 public JAXBHeader(BindingContext context, Object jaxbObject) {
aoqi@0 86 this.jaxbObject = jaxbObject;
aoqi@0 87 // this.bridge = new MarshallerBridge(context);
aoqi@0 88 this.bridge = context.createFragmentBridge();
aoqi@0 89
aoqi@0 90 if (jaxbObject instanceof JAXBElement) {
aoqi@0 91 JAXBElement e = (JAXBElement) jaxbObject;
aoqi@0 92 this.nsUri = e.getName().getNamespaceURI();
aoqi@0 93 this.localName = e.getName().getLocalPart();
aoqi@0 94 }
aoqi@0 95 }
aoqi@0 96
aoqi@0 97 public JAXBHeader(XMLBridge bridge, Object jaxbObject) {
aoqi@0 98 this.jaxbObject = jaxbObject;
aoqi@0 99 this.bridge = bridge;
aoqi@0 100
aoqi@0 101 QName tagName = bridge.getTypeInfo().tagName;
aoqi@0 102 this.nsUri = tagName.getNamespaceURI();
aoqi@0 103 this.localName = tagName.getLocalPart();
aoqi@0 104 }
aoqi@0 105
aoqi@0 106 /**
aoqi@0 107 * Lazily parse the first element to obtain attribute values on it.
aoqi@0 108 */
aoqi@0 109 private void parse() {
aoqi@0 110 RootElementSniffer sniffer = new RootElementSniffer();
aoqi@0 111 try {
aoqi@0 112 bridge.marshal(jaxbObject,sniffer,null);
aoqi@0 113 } catch (JAXBException e) {
aoqi@0 114 // if it's due to us aborting the processing after the first element,
aoqi@0 115 // we can safely ignore this exception.
aoqi@0 116 //
aoqi@0 117 // if it's due to error in the object, the same error will be reported
aoqi@0 118 // when the readHeader() method is used, so we don't have to report
aoqi@0 119 // an error right now.
aoqi@0 120 nsUri = sniffer.getNsUri();
aoqi@0 121 localName = sniffer.getLocalName();
aoqi@0 122 atts = sniffer.getAttributes();
aoqi@0 123 }
aoqi@0 124 }
aoqi@0 125
aoqi@0 126
aoqi@0 127 public @NotNull String getNamespaceURI() {
aoqi@0 128 if(nsUri==null)
aoqi@0 129 parse();
aoqi@0 130 return nsUri;
aoqi@0 131 }
aoqi@0 132
aoqi@0 133 public @NotNull String getLocalPart() {
aoqi@0 134 if(localName==null)
aoqi@0 135 parse();
aoqi@0 136 return localName;
aoqi@0 137 }
aoqi@0 138
aoqi@0 139 public String getAttribute(String nsUri, String localName) {
aoqi@0 140 if(atts==null)
aoqi@0 141 parse();
aoqi@0 142 return atts.getValue(nsUri,localName);
aoqi@0 143 }
aoqi@0 144
aoqi@0 145 public XMLStreamReader readHeader() throws XMLStreamException {
aoqi@0 146 if(infoset==null) {
aoqi@0 147 MutableXMLStreamBuffer buffer = new MutableXMLStreamBuffer();
aoqi@0 148 writeTo(buffer.createFromXMLStreamWriter());
aoqi@0 149 infoset = buffer;
aoqi@0 150 }
aoqi@0 151 return infoset.readAsXMLStreamReader();
aoqi@0 152 }
aoqi@0 153
aoqi@0 154 public <T> T readAsJAXB(Unmarshaller unmarshaller) throws JAXBException {
aoqi@0 155 try {
aoqi@0 156 JAXBResult r = new JAXBResult(unmarshaller);
aoqi@0 157 // bridge marshals a fragment, so we need to add start/endDocument by ourselves
aoqi@0 158 r.getHandler().startDocument();
aoqi@0 159 bridge.marshal(jaxbObject,r);
aoqi@0 160 r.getHandler().endDocument();
aoqi@0 161 return (T)r.getResult();
aoqi@0 162 } catch (SAXException e) {
aoqi@0 163 throw new JAXBException(e);
aoqi@0 164 }
aoqi@0 165 }
aoqi@0 166 /** @deprecated */
aoqi@0 167 public <T> T readAsJAXB(Bridge<T> bridge) throws JAXBException {
aoqi@0 168 return bridge.unmarshal(new JAXBBridgeSource(this.bridge,jaxbObject));
aoqi@0 169 }
aoqi@0 170
aoqi@0 171 public <T> T readAsJAXB(XMLBridge<T> bond) throws JAXBException {
aoqi@0 172 return bond.unmarshal(new JAXBBridgeSource(this.bridge,jaxbObject),null);
aoqi@0 173 }
aoqi@0 174
aoqi@0 175 public void writeTo(XMLStreamWriter sw) throws XMLStreamException {
aoqi@0 176 try {
aoqi@0 177 // Get the encoding of the writer
aoqi@0 178 String encoding = XMLStreamWriterUtil.getEncoding(sw);
aoqi@0 179
aoqi@0 180 // Get output stream and use JAXB UTF-8 writer
aoqi@0 181 OutputStream os = bridge.supportOutputStream() ? XMLStreamWriterUtil.getOutputStream(sw) : null;
aoqi@0 182 if (os != null && encoding != null && encoding.equalsIgnoreCase(SOAPBindingCodec.UTF8_ENCODING)) {
aoqi@0 183 bridge.marshal(jaxbObject, os, sw.getNamespaceContext(), null);
aoqi@0 184 } else {
aoqi@0 185 bridge.marshal(jaxbObject,sw, null);
aoqi@0 186 }
aoqi@0 187 } catch (JAXBException e) {
aoqi@0 188 throw new XMLStreamException2(e);
aoqi@0 189 }
aoqi@0 190 }
aoqi@0 191
aoqi@0 192 public void writeTo(SOAPMessage saaj) throws SOAPException {
aoqi@0 193 try {
aoqi@0 194 SOAPHeader header = saaj.getSOAPHeader();
aoqi@0 195 if (header == null)
aoqi@0 196 header = saaj.getSOAPPart().getEnvelope().addHeader();
aoqi@0 197 bridge.marshal(jaxbObject,header);
aoqi@0 198 } catch (JAXBException e) {
aoqi@0 199 throw new SOAPException(e);
aoqi@0 200 }
aoqi@0 201 }
aoqi@0 202
aoqi@0 203 public void writeTo(ContentHandler contentHandler, ErrorHandler errorHandler) throws SAXException {
aoqi@0 204 try {
aoqi@0 205 bridge.marshal(jaxbObject,contentHandler,null);
aoqi@0 206 } catch (JAXBException e) {
aoqi@0 207 SAXParseException x = new SAXParseException(e.getMessage(),null,null,-1,-1,e);
aoqi@0 208 errorHandler.fatalError(x);
aoqi@0 209 throw x;
aoqi@0 210 }
aoqi@0 211 }
aoqi@0 212 }

mercurial