Skip to content

Package: SaajStaxWriterEx

SaajStaxWriterEx

nameinstructionbranchcomplexitylinemethod
SaajStaxWriterEx(SOAPMessage, String)
M: 8 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
addBinaryText(DataHandler)
M: 44 C: 0
0%
M: 8 C: 0
0%
M: 5 C: 0
0%
M: 9 C: 0
0%
M: 1 C: 0
0%
encodeCid()
M: 9 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
getAttachmentMarshaller()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getNamespaceContext()
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
writeAttribute(String, String, String, String)
M: 15 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
writeBinary(DataHandler)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
writeBinary(String)
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
writeBinary(byte[], int, int, String)
M: 35 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
writeEndElement()
M: 12 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
writePCDATA(CharSequence)
M: 25 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
writeStartElement(String, String, String)
M: 18 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*
2: * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Distribution License v. 1.0, which is available at
6: * http://www.eclipse.org/org/documents/edl-v10.php.
7: *
8: * SPDX-License-Identifier: BSD-3-Clause
9: */
10:
11: package com.sun.xml.messaging.saaj.util.stax;
12:
13: import java.io.OutputStream;
14: import java.util.Arrays;
15: import java.util.Iterator;
16: import java.util.UUID;
17:
18: import jakarta.activation.DataHandler;
19: import jakarta.xml.bind.attachment.AttachmentMarshaller;
20: import jakarta.xml.soap.SOAPException;
21: import jakarta.xml.soap.SOAPMessage;
22: import javax.xml.stream.XMLStreamException;
23:
24: import org.jvnet.staxex.Base64Data;
25: import org.jvnet.staxex.BinaryText;
26: import org.jvnet.staxex.MtomEnabled;
27: import org.jvnet.staxex.NamespaceContextEx;
28: import org.jvnet.staxex.StreamingDataHandler;
29: import org.jvnet.staxex.XMLStreamWriterEx;
30: import org.jvnet.staxex.util.MtomStreamWriter;
31: //
32: //import com.sun.xml.ws.api.message.saaj.SaajStaxWriter;
33: //import com.sun.xml.ws.developer.StreamingDataHandler;
34: //import com.sun.xml.ws.streaming.MtomStreamWriter;
35:
36: /**
37: * SaajStaxWriterEx converts XMLStreamWriterEx calls to build an orasaaj SOAPMessage with BinaryTextImpl.
38: *
39: * @author shih-chang.chen@oracle.com
40: */
41: public class SaajStaxWriterEx extends SaajStaxWriter implements XMLStreamWriterEx, MtomStreamWriter {
42:
43: static final protected String xopNS = "http://www.w3.org/2004/08/xop/include";
44: static final protected String Include = "Include";
45: static final protected String href = "href";
46:
47: private enum State {xopInclude, others};
48: private State state = State.others;
49: private BinaryText binaryText;
50:
51: public SaajStaxWriterEx(SOAPMessage msg, String uri) throws SOAPException {
52: super(msg, uri);
53: }
54:
55: @Override
56: public void writeStartElement(String prefix, String ln, String ns) throws XMLStreamException {
57:• if (xopNS.equals(ns) && Include.equals(ln)) {
58: state = State.xopInclude;
59: return;
60: } else {
61: super.writeStartElement(prefix, ln, ns);
62: }
63: }
64:
65: @Override
66: public void writeEndElement() throws XMLStreamException {
67:• if (state.equals(State.xopInclude)) {
68: state = State.others;
69: } else {
70: super.writeEndElement();
71: }
72: }
73:
74: @Override
75: public void writeAttribute(String prefix, String ns, String ln, String value) throws XMLStreamException {
76:• if (binaryText != null && href.equals(ln)) {
77: return;
78: } else {
79: super.writeAttribute(prefix, ns, ln, value);
80: }
81: }
82:
83: // @Override
84: // public void writeComment(String data) throws XMLStreamException {
85: // ((ElementImpl)currentElement).addCommentNode(data);
86: // }
87: //
88: // @Override
89: // public void writeCData(String data) throws XMLStreamException {
90: // CDataTextImpl cdt = new CDataTextImpl(soap.getSOAPPart(), data);
91: // currentElement.appendChild(cdt);
92: // }
93:
94: @Override
95: public NamespaceContextEx getNamespaceContext() {
96: return new NamespaceContextEx() {
97: @Override
98: public String getNamespaceURI(String prefix) {
99: return currentElement.getNamespaceURI(prefix);
100: }
101: @Override
102: public String getPrefix(String namespaceURI) {
103: return currentElement.lookupPrefix(namespaceURI);
104: }
105: @Override
106: public Iterator getPrefixes(final String namespaceURI) {
107: return new Iterator<String>() {
108: String prefix = getPrefix(namespaceURI);
109: @Override
110: public boolean hasNext() {
111: return (prefix != null);
112: }
113: @Override
114: public String next() {
115: if (prefix == null) throw new java.util.NoSuchElementException();
116: String next = prefix;
117: prefix = null;
118: return next;
119: }
120: @Override
121: public void remove() {}
122: };
123: }
124: @Override
125: public Iterator<Binding> iterator() {
126: return new Iterator<Binding>() {
127: @Override
128: public boolean hasNext() { return false; }
129: @Override
130: public Binding next() { return null; }
131: @Override
132: public void remove() {}
133: };
134: }
135: };
136: }
137:
138: @Override
139: public void writeBinary(DataHandler data) throws XMLStreamException {
140: // binaryText = BinaryTextImpl.createBinaryTextFromDataHandler((MessageImpl)soap, null, currentElement.getOwnerDocument(), data);
141: // currentElement.appendChild(binaryText);
142: addBinaryText(data);
143: }
144:
145: @Override
146: public OutputStream writeBinary(String arg0) throws XMLStreamException {
147: return null;
148: }
149:
150: @Override
151: public void writeBinary(byte[] data, int offset, int length, String contentType) throws XMLStreamException {
152: // if (mtomThreshold == -1 || mtomThreshold > length) return null;
153:• byte[] bytes = (offset == 0 && length == data.length) ? data : Arrays.copyOfRange(data, offset, offset + length);
154:• if (currentElement instanceof MtomEnabled) {
155: binaryText = ((MtomEnabled) currentElement).addBinaryText(bytes);
156: } else {
157: throw new IllegalStateException("The currentElement is not MtomEnabled " + currentElement);
158: }
159: }
160:
161: @Override
162: public void writePCDATA(CharSequence arg0) throws XMLStreamException {
163:• if (arg0 instanceof Base64Data) {
164: // The fix of StreamReaderBufferCreator preserves this dataHandler
165: addBinaryText(((Base64Data) arg0).getDataHandler());
166: } else {
167: // We should not normally get here as we expect a DataHandler,
168: // but this is the most general solution. If we do get
169: // something other than a Data Handler, create a Text node with
170: // the data. Another alternative would be to throw an exception,
171: // but in the most general case, we don't know whether this input
172: // is expected.
173: try {
174: currentElement.addTextNode(arg0.toString());
175: } catch (SOAPException e) {
176: throw new XMLStreamException("Cannot add Text node", e);
177: }
178: }
179: }
180:
181: static private String encodeCid() {
182: String cid = "example.jaxws.sun.com";
183: String name = UUID.randomUUID() + "@";
184: return name + cid;
185: }
186:
187: private String addBinaryText(DataHandler data) {
188: String hrefOrCid = null;
189:• if (data instanceof StreamingDataHandler) {
190: hrefOrCid = ((StreamingDataHandler) data).getHrefCid();
191: }
192:• if (hrefOrCid == null) hrefOrCid = encodeCid();
193:
194:• String prefixedCid = (hrefOrCid.startsWith("cid:")) ? hrefOrCid : "cid:" + hrefOrCid;
195: // Should we do the threshold processing on DataHandler ? But that would be
196: // expensive as DataHolder need to read the data again from its source
197: //binaryText = BinaryTextImpl.createBinaryTextFromDataHandler((MessageImpl) soap, prefixedCid, currentElement.getOwnerDocument(), data);
198: //currentElement.appendChild(binaryText);
199:• if (currentElement instanceof MtomEnabled) {
200: binaryText = ((MtomEnabled) currentElement).addBinaryText(prefixedCid, data);
201: } else {
202: throw new IllegalStateException("The currentElement is not MtomEnabled " + currentElement);
203: }
204: return hrefOrCid;
205: }
206:
207: @Override
208: public AttachmentMarshaller getAttachmentMarshaller() {
209: return new AttachmentMarshaller() {
210: @Override
211: public String addMtomAttachment(DataHandler data, String ns, String ln) {
212: // if (mtomThreshold == -1) return null;
213: String hrefOrCid = addBinaryText(data);
214: // return binaryText.getHref();
215: return hrefOrCid;
216: }
217:
218: @Override
219: public String addMtomAttachment(byte[] data, int offset, int length, String mimeType, String ns, String ln) {
220: // if (mtomThreshold == -1 || mtomThreshold > length) return null;
221: byte[] bytes = (offset == 0 && length == data.length) ? data : Arrays.copyOfRange(data, offset, offset + length);
222: // binaryText = (BinaryTextImpl) ((ElementImpl) currentElement).addAsBase64TextNode(bytes);
223: if (currentElement instanceof MtomEnabled) {
224: binaryText = ((MtomEnabled) currentElement).addBinaryText(bytes);
225: } else {
226: throw new IllegalStateException("The currentElement is not MtomEnabled " + currentElement);
227: }
228: return binaryText.getHref();
229: }
230:
231: @Override
232: public String addSwaRefAttachment(DataHandler data) {
233: return "cid:"+encodeCid();
234: }
235:
236: @Override
237: public boolean isXOPPackage() {
238: return true;
239: }
240: };
241: }
242: }