soapmessageimpl.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 482 行 · 第 1/2 页
JAVA
482 行
* <CODE>ProviderConnection.send</CODE>, <CODE> SOAPConnection.call</CODE>, or <CODE>
* SOAPMessage.writeTo</CODE>. However, if changes are made to a message that was received or to
* one that has already been sent, the method <CODE>saveChanges</CODE> needs to be called
* explicitly in order to save the changes. The method <CODE>saveChanges</CODE> also generates
* any changes that can be read back (for example, a MessageId in profiles that support a
* message id). All MIME headers in a message that is created for sending purposes are
* guaranteed to have valid values only after <CODE>saveChanges</CODE> has been called.
* <p/>
* <P>In addition, this method marks the point at which the data from all constituent
* <CODE>AttachmentPart</CODE> objects are pulled into the message.</P>
*
* @throws SOAPException if there was a problem saving changes to this message.
*/
public void saveChanges() throws SOAPException {
saveRequired = false;
// TODO not sure of the implementation
}
public void setSaveRequired() {
this.saveRequired = true;
}
/**
* Indicates whether this <CODE>SOAPMessage</CODE> object has had the method {@link
* #saveChanges()} called on it.
*
* @return <CODE>true</CODE> if <CODE>saveChanges</CODE> has been called on this message at
* least once; <CODE> false</CODE> otherwise.
*/
public boolean saveRequired() {
return saveRequired;
}
/**
* Writes this <CODE>SOAPMessage</CODE> object to the given output stream. The externalization
* format is as defined by the SOAP 1.1 with Attachments specification.
* <p/>
* <P>If there are no attachments, just an XML stream is written out. For those messages that
* have attachments, <CODE>writeTo</CODE> writes a MIME-encoded byte stream.</P>
*
* @param out the <CODE>OutputStream</CODE> object to which this <CODE>SOAPMessage</CODE> object
* will be written
* @throws SOAPException if there was a problem in externalizing this SOAP message
* @throws IOException if an I/O error occurs
*/
public void writeTo(OutputStream out) throws SOAPException, IOException {
try {
OMOutputFormat format = new OMOutputFormat();
format.setCharSetEncoding((String)getProperty(CHARACTER_SET_ENCODING));
String writeXmlDecl = (String)getProperty(WRITE_XML_DECLARATION);
if (writeXmlDecl == null || writeXmlDecl.equals("false")) {
//SAAJ default case doesn't send XML decl
format.setIgnoreXMLDeclaration(true);
}
//the writeTo method forces the elements to be built!!!
((SOAPEnvelopeImpl)soapPart.getEnvelope()).getOMEnvelope().serialize(out, format);
saveChanges();
} catch (Exception e) {
throw new SOAPException(e);
}
}
/**
* Associates the specified value with the specified property. If there was already a value
* associated with this property, the old value is replaced.
* <p/>
* The valid property names include <code>WRITE_XML_DECLARATION</code> and
* <code>CHARACTER_SET_ENCODING</code>. All of these standard SAAJ properties are prefixed by
* "javax.xml.soap". Vendors may also add implementation specific properties. These properties
* must be prefixed with package names that are unique to the vendor.
* <p/>
* Setting the property <code>WRITE_XML_DECLARATION</code> to <code>"true"</code> will cause an
* XML Declaration to be written out at the start of the SOAP message. The default value of
* "false" suppresses this declaration.
* <p/>
* The property <code>CHARACTER_SET_ENCODING</code> defaults to the value <code>"utf-8"</code>
* which causes the SOAP message to be encoded using UTF-8. Setting
* <code>CHARACTER_SET_ENCODING</code> to <code>"utf-16"</code> causes the SOAP message to be
* encoded using UTF-16.
* <p/>
* Some implementations may allow encodings in addition to UTF-8 and UTF-16. Refer to your
* vendor's documentation for details.
*
* @param property the property with which the specified value is to be associated
* @param value the value to be associated with the specified property
*/
public void setProperty(String property, Object value) {
props.put(property, value);
}
/**
* Retrieves value of the specified property.
*
* @param property the name of the property to retrieve
* @return the value of the property or <code>null</code> if no such property exists
* @throws SOAPException if the property name is not recognized
*/
public Object getProperty(String property) throws SOAPException {
return props.get(property);
}
/**
* Returns an AttachmentPart object that is associated with an attachment that is referenced by
* this SOAPElement or null if no such attachment exists. References can be made via an href
* attribute as described in SOAP Messages with Attachments (http://www.w3.org/TR/SOAPattachments#SOAPReferenceToAttachements)
* , or via a single Text child node containing a URI as described in the WS-I Attachments
* Profile 1.0 for elements of schema type ref:swaRef(ref:swaRef (http://www.wsi.org/Profiles/AttachmentsProfile-1.0-2004-08-24.html")
* ). These two mechanisms must be supported. The support for references via href attribute also
* implies that this method should also be supported on an element that is an xop:Include
* element (XOP (http://www.w3.org/2000/xp/Group/3/06/Attachments/XOP.html) ). other reference
* mechanisms may be supported by individual implementations of this standard. Contact your
* vendor for details.
*
* @param element - The SOAPElement containing the reference to an Attachment
* @return the referenced AttachmentPart or null if no such AttachmentPart exists or no
* reference can be found in this SOAPElement.
* @throws SOAPException - if there is an error in the attempt to access the attachment
*/
public AttachmentPart getAttachment(SOAPElement soapelement) throws SOAPException {
//TODO read strings from constants
Iterator iterator = getAttachments();
{
AttachmentPartImpl attachmentPart;
while (iterator.hasNext()) {
attachmentPart = (AttachmentPartImpl)iterator.next();
String[] contentIds = attachmentPart.getMimeHeader("Content-Id");
//References can be made via an href attribute as described in SOAP Messages
//with Attachments or via a single Text child node containing a URI
String reference = soapelement.getAttribute("href");
if (reference == null || reference.trim().length() == 0) {
reference = soapelement.getValue();
if (reference == null || reference.trim().length() == 0) {
return null;
}
}
for (int a = 0; a < contentIds.length; a++) {
//eg: cid:gifImage scenario
String idPart = reference.substring(reference.indexOf(":") + 1);
idPart = "<" + idPart + ">";
if (idPart.equals(contentIds[a])) {
return attachmentPart;
}
}
String[] contentLocations = attachmentPart.getMimeHeader("Content-Location");
if (!(contentLocations == null)) {
//uri scenario
for (int b = 0; b < contentLocations.length; b++) {
if (reference.equals(contentLocations[b])) {
return attachmentPart;
}
}
}
}
}
return null;
}
/**
* Removes all the AttachmentPart objects that have header entries that match the specified
* headers. Note that the removed attachment could have headers in addition to those specified.
*
* @param headers - a MimeHeaders object containing the MIME headers for which to search
* @since SAAJ 1.3
*/
public void removeAttachments(MimeHeaders headers) {
Collection newAttachmentParts = new ArrayList();
Iterator attachmentPartsItr = attachmentParts.iterator();
for (Iterator iter = attachmentPartsItr; iter.hasNext();) {
AttachmentPart attachmentPart = (AttachmentPart)iter.next();
//Get all the headers
Iterator allMIMEHeaders = headers.getAllHeaders();
for (Iterator iterator = allMIMEHeaders; iterator.hasNext();) {
MimeHeader mimeHeader = (MimeHeader)iterator.next();
String[] headerValues = attachmentPart.getMimeHeader(mimeHeader.getName());
//if values for this header name, do not remove it
if (headerValues.length != 0) {
if (!(headerValues[0].equals(mimeHeader.getValue()))) {
newAttachmentParts.add(attachmentPart);
}
}
}
}
attachmentParts.clear();
this.attachmentParts = newAttachmentParts;
}
/**
* Gets the SOAP Header contained in this <code>SOAPMessage</code> object.
*
* @return the <code>SOAPHeader</code> object contained by this <code>SOAPMessage</code> object
* @throws javax.xml.soap.SOAPException if the SOAP Header does not exist or cannot be
* retrieved
*/
public SOAPHeader getSOAPHeader() throws SOAPException {
return this.soapPart.getEnvelope().getHeader();
}
/**
* Gets the SOAP Body contained in this <code>SOAPMessage</code> object.
*
* @return the <code>SOAPBody</code> object contained by this <code>SOAPMessage</code> object
* @throws javax.xml.soap.SOAPException if the SOAP Body does not exist or cannot be retrieved
*/
public SOAPBody getSOAPBody() throws SOAPException {
return this.soapPart.getEnvelope().getBody();
}
/**
* Set the character encoding based on the <code>contentType</code> parameter
*
* @param contentType
*/
private void setCharsetEncoding(final String contentType) {
if (contentType != null) {
int delimiterIndex = contentType.lastIndexOf("charset");
if (delimiterIndex > 0) {
String charsetPart = contentType.substring(delimiterIndex);
int charsetIndex = charsetPart.indexOf('=');
String charset = charsetPart.substring(charsetIndex + 1).trim();
if ((charset.startsWith("\"") || charset.startsWith("\'"))) {
charset = charset.substring(1, charset.length());
}
if ((charset.endsWith("\"") || charset.endsWith("\'"))) {
charset = charset.substring(0, charset.length() - 1);
}
int index = charset.indexOf(';');
if (index != -1) {
charset = charset.substring(0, index);
}
setProperty(SOAPMessage.CHARACTER_SET_ENCODING, charset);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?