src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MtomCodec.java

Print this page




  24  */
  25 
  26 package com.sun.xml.internal.ws.encoding;
  27 
  28 import com.sun.istack.internal.NotNull;
  29 import com.sun.xml.internal.bind.DatatypeConverterImpl;
  30 import com.sun.xml.internal.ws.api.SOAPVersion;
  31 import com.sun.xml.internal.ws.api.WSFeatureList;
  32 import com.sun.xml.internal.ws.api.message.Attachment;
  33 import com.sun.xml.internal.ws.api.message.AttachmentSet;
  34 import com.sun.xml.internal.ws.api.message.Packet;
  35 import com.sun.xml.internal.ws.api.pipe.ContentType;
  36 import com.sun.xml.internal.ws.api.pipe.StreamSOAPCodec;
  37 import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory;
  38 import com.sun.xml.internal.ws.api.streaming.XMLStreamWriterFactory;
  39 import com.sun.xml.internal.ws.developer.SerializationFeature;
  40 import com.sun.xml.internal.ws.developer.StreamingDataHandler;
  41 import com.sun.xml.internal.ws.message.MimeAttachmentSet;
  42 import com.sun.xml.internal.ws.streaming.XMLStreamWriterUtil;
  43 import com.sun.xml.internal.ws.util.ByteArrayDataSource;

  44 import com.sun.xml.internal.ws.util.xml.XMLStreamReaderFilter;
  45 import com.sun.xml.internal.ws.util.xml.XMLStreamWriterFilter;
  46 import com.sun.xml.internal.ws.streaming.MtomStreamWriter;
  47 import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil;
  48 import com.sun.xml.internal.ws.server.UnsupportedMediaException;
  49 import com.sun.xml.internal.org.jvnet.staxex.Base64Data;
  50 import com.sun.xml.internal.org.jvnet.staxex.NamespaceContextEx;
  51 import com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx;
  52 import com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx;
  53 
  54 import javax.activation.DataHandler;
  55 import javax.xml.namespace.NamespaceContext;
  56 import javax.xml.stream.XMLStreamConstants;
  57 import javax.xml.stream.XMLStreamException;
  58 import javax.xml.stream.XMLStreamReader;
  59 import javax.xml.stream.XMLStreamWriter;
  60 import javax.xml.ws.WebServiceException;
  61 import javax.xml.ws.soap.MTOMFeature;
  62 import javax.xml.bind.attachment.AttachmentMarshaller;
  63 import java.io.IOException;


 357         @Override
 358         public OutputStream writeBinary(String contentType) throws XMLStreamException {
 359             throw new UnsupportedOperationException();
 360         }
 361 
 362         @Override
 363         public void writePCDATA(CharSequence data) throws XMLStreamException {
 364             if(data == null)
 365                 return;
 366             if(data instanceof Base64Data){
 367                 Base64Data binaryData = (Base64Data)data;
 368                 writeBinary(binaryData.getDataHandler());
 369                 return;
 370             }
 371             writeCharacters(data.toString());
 372         }
 373 
 374         private void writeBinary(ByteArrayBuffer bab) {
 375             try {
 376                 mtomAttachments.add(bab);


 377                 writer.setPrefix("xop", XOP_NAMESPACEURI);
 378                 writer.writeNamespace("xop", XOP_NAMESPACEURI);

 379                 writer.writeStartElement(XOP_NAMESPACEURI, XOP_LOCALNAME);
 380                 writer.writeAttribute("href", "cid:"+bab.contentId);
 381                 writer.writeEndElement();
 382                 writer.flush();
 383             } catch (XMLStreamException e) {
 384                 throw new WebServiceException(e);
 385             }
 386         }
 387 
 388         @Override
 389         public Object getProperty(String name) throws IllegalArgumentException {
 390             // Hack for JDK6's SJSXP
 391             if (name.equals("sjsxp-outputstream") && writer instanceof Map) {
 392                 Object obj = ((Map) writer).get("sjsxp-outputstream");
 393                 if (obj != null) {
 394                     return obj;
 395                 }
 396             }
 397             return super.getProperty(name);
 398         }


 496         //To be used with #getTextCharacters
 497         private char[] base64EncodedText;
 498 
 499         private String xopHref;
 500 
 501         public MtomXMLStreamReaderEx(MimeMultipartParser mimeMP, XMLStreamReader reader) {
 502             super(reader);
 503             this.mimeMP = mimeMP;
 504         }
 505 
 506         @Override
 507         public CharSequence getPCDATA() throws XMLStreamException {
 508             if(xopReferencePresent){
 509                 return base64AttData;
 510             }
 511             return reader.getText();
 512         }
 513 
 514         @Override
 515         public NamespaceContextEx getNamespaceContext() {
 516             NamespaceContext nsContext = reader.getNamespaceContext();
 517             return new MtomNamespaceContextEx(nsContext);
 518         }
 519 
 520         @Override
 521         public String getElementTextTrim() throws XMLStreamException {
 522             throw new UnsupportedOperationException();
 523         }
 524 
 525         private static class MtomNamespaceContextEx implements NamespaceContextEx {
 526             private final NamespaceContext nsContext;
 527 
 528             public MtomNamespaceContextEx(NamespaceContext nsContext) {
 529                 this.nsContext = nsContext;
 530             }
 531 
 532             @Override
 533             public Iterator<Binding> iterator() {
 534                 throw new UnsupportedOperationException();
 535             }
 536 
 537             @Override
 538             public String getNamespaceURI(String prefix) {
 539                 return nsContext.getNamespaceURI(prefix);
 540             }
 541 
 542             @Override
 543             public String getPrefix(String namespaceURI) {
 544                 return nsContext.getPrefix(namespaceURI);
 545             }
 546 
 547             @Override
 548             public Iterator getPrefixes(String namespaceURI) {
 549                 return nsContext.getPrefixes(namespaceURI);
 550             }
 551 
 552         }
 553 
 554         @Override
 555         public int getTextLength() {
 556             if (xopReferencePresent) {
 557                 return base64AttData.length();
 558             }
 559             return reader.getTextLength();
 560         }
 561 
 562         @Override
 563         public int getTextStart() {
 564             if (xopReferencePresent) {
 565                 return 0;
 566             }
 567             return reader.getTextStart();
 568         }
 569 
 570         @Override
 571         public int getEventType() {




  24  */
  25 
  26 package com.sun.xml.internal.ws.encoding;
  27 
  28 import com.sun.istack.internal.NotNull;
  29 import com.sun.xml.internal.bind.DatatypeConverterImpl;
  30 import com.sun.xml.internal.ws.api.SOAPVersion;
  31 import com.sun.xml.internal.ws.api.WSFeatureList;
  32 import com.sun.xml.internal.ws.api.message.Attachment;
  33 import com.sun.xml.internal.ws.api.message.AttachmentSet;
  34 import com.sun.xml.internal.ws.api.message.Packet;
  35 import com.sun.xml.internal.ws.api.pipe.ContentType;
  36 import com.sun.xml.internal.ws.api.pipe.StreamSOAPCodec;
  37 import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory;
  38 import com.sun.xml.internal.ws.api.streaming.XMLStreamWriterFactory;
  39 import com.sun.xml.internal.ws.developer.SerializationFeature;
  40 import com.sun.xml.internal.ws.developer.StreamingDataHandler;
  41 import com.sun.xml.internal.ws.message.MimeAttachmentSet;
  42 import com.sun.xml.internal.ws.streaming.XMLStreamWriterUtil;
  43 import com.sun.xml.internal.ws.util.ByteArrayDataSource;
  44 import com.sun.xml.internal.ws.util.xml.NamespaceContextExAdaper;
  45 import com.sun.xml.internal.ws.util.xml.XMLStreamReaderFilter;
  46 import com.sun.xml.internal.ws.util.xml.XMLStreamWriterFilter;
  47 import com.sun.xml.internal.ws.streaming.MtomStreamWriter;
  48 import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil;
  49 import com.sun.xml.internal.ws.server.UnsupportedMediaException;
  50 import com.sun.xml.internal.org.jvnet.staxex.Base64Data;
  51 import com.sun.xml.internal.org.jvnet.staxex.NamespaceContextEx;
  52 import com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx;
  53 import com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx;
  54 
  55 import javax.activation.DataHandler;
  56 import javax.xml.namespace.NamespaceContext;
  57 import javax.xml.stream.XMLStreamConstants;
  58 import javax.xml.stream.XMLStreamException;
  59 import javax.xml.stream.XMLStreamReader;
  60 import javax.xml.stream.XMLStreamWriter;
  61 import javax.xml.ws.WebServiceException;
  62 import javax.xml.ws.soap.MTOMFeature;
  63 import javax.xml.bind.attachment.AttachmentMarshaller;
  64 import java.io.IOException;


 358         @Override
 359         public OutputStream writeBinary(String contentType) throws XMLStreamException {
 360             throw new UnsupportedOperationException();
 361         }
 362 
 363         @Override
 364         public void writePCDATA(CharSequence data) throws XMLStreamException {
 365             if(data == null)
 366                 return;
 367             if(data instanceof Base64Data){
 368                 Base64Data binaryData = (Base64Data)data;
 369                 writeBinary(binaryData.getDataHandler());
 370                 return;
 371             }
 372             writeCharacters(data.toString());
 373         }
 374 
 375         private void writeBinary(ByteArrayBuffer bab) {
 376             try {
 377                 mtomAttachments.add(bab);
 378                 String prefix = writer.getPrefix(XOP_NAMESPACEURI);
 379                 if (prefix == null || !prefix.equals("xop")) {
 380                     writer.setPrefix("xop", XOP_NAMESPACEURI);
 381                     writer.writeNamespace("xop", XOP_NAMESPACEURI);
 382                 }
 383                 writer.writeStartElement(XOP_NAMESPACEURI, XOP_LOCALNAME);
 384                 writer.writeAttribute("href", "cid:"+bab.contentId);
 385                 writer.writeEndElement();
 386                 writer.flush();
 387             } catch (XMLStreamException e) {
 388                 throw new WebServiceException(e);
 389             }
 390         }
 391 
 392         @Override
 393         public Object getProperty(String name) throws IllegalArgumentException {
 394             // Hack for JDK6's SJSXP
 395             if (name.equals("sjsxp-outputstream") && writer instanceof Map) {
 396                 Object obj = ((Map) writer).get("sjsxp-outputstream");
 397                 if (obj != null) {
 398                     return obj;
 399                 }
 400             }
 401             return super.getProperty(name);
 402         }


 500         //To be used with #getTextCharacters
 501         private char[] base64EncodedText;
 502 
 503         private String xopHref;
 504 
 505         public MtomXMLStreamReaderEx(MimeMultipartParser mimeMP, XMLStreamReader reader) {
 506             super(reader);
 507             this.mimeMP = mimeMP;
 508         }
 509 
 510         @Override
 511         public CharSequence getPCDATA() throws XMLStreamException {
 512             if(xopReferencePresent){
 513                 return base64AttData;
 514             }
 515             return reader.getText();
 516         }
 517 
 518         @Override
 519         public NamespaceContextEx getNamespaceContext() {
 520             return new NamespaceContextExAdaper(reader.getNamespaceContext());

 521         }
 522 
 523         @Override
 524         public String getElementTextTrim() throws XMLStreamException {
 525             throw new UnsupportedOperationException();





























 526         }
 527 
 528         @Override
 529         public int getTextLength() {
 530             if (xopReferencePresent) {
 531                 return base64AttData.length();
 532             }
 533             return reader.getTextLength();
 534         }
 535 
 536         @Override
 537         public int getTextStart() {
 538             if (xopReferencePresent) {
 539                 return 0;
 540             }
 541             return reader.getTextStart();
 542         }
 543 
 544         @Override
 545         public int getEventType() {