Hi Folks,
Here is a patch for handling SOAP 1.1 Fault Actors and SOAP 1.2 Fault
Roles properly in DOOM.
Earlier org.apache.axis2.soap.impl.dom.SOAPFaultRoleImpl which was
being extended by SOAP11FaultRoleImpl & SOAP12FaultRoleImpl, was using
"Role" as the localName, which was causing SOAP1.1 Fault Roles not to
be handles properly.
--
Thanks
Afkham Azeez
Index: modules/core/src/org/apache/axis2/client/MEPClient.java
===================================================================
--- modules/core/src/org/apache/axis2/client/MEPClient.java (revision 365352)
+++ modules/core/src/org/apache/axis2/client/MEPClient.java (working copy)
@@ -174,8 +174,11 @@
}
String soapVersionURI = clientOptions.getSoapVersionURI();
+ String soapFactory = clientOptions.getSoapFactory();
- if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapVersionURI)) {
+ if(soapFactory != null && soapFactory.trim().length() != 0){
+ return OMAbstractFactory.getSOAPFactory(soapFactory).getDefaultEnvelope();
+ } else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapVersionURI)) {
return OMAbstractFactory.getSOAP12Factory().getDefaultEnvelope();
} else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapVersionURI)
|| "".equals(soapVersionURI) || (soapVersionURI == null)) {
@@ -243,7 +246,7 @@
protected void inferTransportOutDescription(MessageContext msgCtx) throws AxisFault {
// user can set the transport by giving a TransportOutDescription or we
- // will deduce that from the "to" epr information, if user has not set the
+ // will deduce that from the "to" epr information, if user has not set the
// TransportOutDescription, lets infer that
if (clientOptions.getSenderTransport() == null) {
AxisConfiguration axisConfig =
Index: modules/core/src/org/apache/axis2/client/Options.java
===================================================================
--- modules/core/src/org/apache/axis2/client/Options.java (revision 365352)
+++ modules/core/src/org/apache/axis2/client/Options.java (working copy)
@@ -54,6 +54,7 @@
private Boolean isExceptionToBeThrownOnSOAPFault; // defaults to true;
private long timeOutInMilliSeconds = -1; // = DEFAULT_TIMEOUT_MILLISECONDS;
private Boolean useSeparateListener; // defaults to false
+ private String soapFactory;
// Addressing specific properties
private String action;
@@ -214,6 +215,14 @@
return soapVersionURI == null ? SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI : soapVersionURI;
}
+ public String getSoapFactory() {
+ if (soapFactory == null && parent != null) {
+ soapFactory = parent.getSoapFactory();
+ }
+
+ return soapFactory == null ? "" : soapFactory;
+ }
+
/**
* Gets the wait time after which a client times out in a blocking scenario.
* The default is Options#DEFAULT_TIMEOUT_MILLISECONDS
@@ -307,6 +316,10 @@
this.messageId = messageId;
}
+ public void setSoapFactory(String soapFactory) {
+ this.soapFactory = soapFactory;
+ }
+
/**
* This will set the properties to the context. But in setting that one may need to "copy" all
* the properties from the source properties to the target properties. To enable this we introduced
@@ -408,7 +421,7 @@
if (!useSeparateListener) {
boolean isTransportsEqual = senderTransport.equals(listenerTransport);
boolean isATwoWaytransport = Constants.TRANSPORT_HTTP.equals(senderTransport)
- || Constants.TRANSPORT_TCP.equals(senderTransport);
+ || Constants.TRANSPORT_TCP.equals(senderTransport);
if ((!isTransportsEqual || !isATwoWaytransport)) {
throw new AxisFault(Messages.getMessage("useSeparateListenerLimited"));
Index: modules/doom/src/org/apache/axis2/soap/impl/dom/SOAPFaultRoleImpl.java
===================================================================
--- modules/doom/src/org/apache/axis2/soap/impl/dom/SOAPFaultRoleImpl.java (revision 365352)
+++ modules/doom/src/org/apache/axis2/soap/impl/dom/SOAPFaultRoleImpl.java (working copy)
@@ -30,10 +30,11 @@
public abstract class SOAPFaultRoleImpl extends SOAPElement implements org.apache.axis2.soap.SOAPFaultRole {
public SOAPFaultRoleImpl(SOAPFault parent,
+ String localName,
boolean extractNamespaceFromParent) throws SOAPProcessingException {
super(parent,
- SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME,
- extractNamespaceFromParent);
+ localName,
+ extractNamespaceFromParent);
}
public SOAPFaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
@@ -55,7 +56,7 @@
builderType = this.builder.getBuilderType();
}
if ((builderType == PUSH_TYPE_BUILDER)
- && (builder.getRegisteredContentHandler() == null)) {
+ && (builder.getRegisteredContentHandler() == null)) {
builder.registerExternalContentHandler(new StreamWriterToContentHandlerConverter(omOutput));
}
Index: modules/doom/src/org/apache/axis2/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java
===================================================================
--- modules/doom/src/org/apache/axis2/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java (revision 365352)
+++ modules/doom/src/org/apache/axis2/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java (working copy)
@@ -30,7 +30,7 @@
public class SOAP11FaultRoleImpl extends SOAPFaultRoleImpl {
public SOAP11FaultRoleImpl(SOAPFault parent) throws SOAPProcessingException {
- super(parent, false);
+ super(parent, SOAP11Constants.SOAP_FAULT_ACTOR_LOCAL_NAME, false);
}
public SOAP11FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
Index: modules/doom/src/org/apache/axis2/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java
===================================================================
--- modules/doom/src/org/apache/axis2/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java (revision 365352)
+++ modules/doom/src/org/apache/axis2/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java (working copy)
@@ -18,13 +18,14 @@
import org.apache.axis2.om.OMElement;
import org.apache.axis2.om.OMXMLParserWrapper;
+import org.apache.axis2.soap.SOAP12Constants;
import org.apache.axis2.soap.SOAPFault;
import org.apache.axis2.soap.SOAPProcessingException;
import org.apache.axis2.soap.impl.dom.SOAPFaultRoleImpl;
public class SOAP12FaultRoleImpl extends SOAPFaultRoleImpl {
public SOAP12FaultRoleImpl(SOAPFault parent) throws SOAPProcessingException {
- super(parent, true);
+ super(parent, SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME, true);
}
public SOAP12FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder) {
Index: modules/doom/src/org/apache/axis2/om/impl/dom/ChildNode.java
===================================================================
--- modules/doom/src/org/apache/axis2/om/impl/dom/ChildNode.java (revision 365352)
+++ modules/doom/src/org/apache/axis2/om/impl/dom/ChildNode.java (working copy)
@@ -23,127 +23,131 @@
public abstract class ChildNode extends NodeImpl {
- protected ChildNode previousSibling;
-
- protected ChildNode nextSibling;
-
- protected ParentNode parentNode;
-
-
- /**
- * @param ownerNode
- */
- protected ChildNode(DocumentImpl ownerDocument) {
- super(ownerDocument);
- }
-
- protected ChildNode() {
-
- }
-
- public OMNode getNextOMSibling() throws OMException {
+ protected ChildNode previousSibling;
+
+ protected ChildNode nextSibling;
+
+ protected ParentNode parentNode;
+
+
+ /**
+ * @param ownerNode
+ */
+ protected ChildNode(DocumentImpl ownerDocument) {
+ super(ownerDocument);
+ }
+
+ protected ChildNode() {
+
+ }
+
+ public OMNode getNextOMSibling() throws OMException {
while ((nextSibling == null) && !this.parentNode.done) {
this.parentNode.buildNext();
}
return nextSibling;
- }
- public Node getNextSibling() {
- return (Node)this.getNextOMSibling();
- }
- public OMNode getPreviousOMSibling() {
- return this.previousSibling;
- }
- public Node getPreviousSibling() {
- return this.previousSibling;
- }
+ }
- ///
- ///OMNode methods
- ///
- public void setNextOMSibling(OMNode node) {
- if(node instanceof ChildNode)
- this.nextSibling = (ChildNode)node;
- else
- throw new OMException("The node is not a " + ChildNode.class);
- }
+ public Node getNextSibling() {
+ return (Node) this.getNextOMSibling();
+ }
- public void setPreviousOMSibling(OMNode node) {
- if(node instanceof ChildNode)
- this.previousSibling = (ChildNode)node;
- else
- throw new OMException("The node is not a " + ChildNode.class);
- }
-
- public OMContainer getParent() throws OMException {
- return (OMContainer)this.parentNode;
- }
-
- public Node getParentNode() {
- return this.parentNode;
- }
-
- public void setParent(OMContainer element) {
- if(element instanceof ParentNode)
- this.parentNode = (ParentNode)element;
- else
- throw new OMException("The given parent is not of the type " + ParentNode.class);
+ public OMNode getPreviousOMSibling() {
+ return this.previousSibling;
+ }
- }
-
- public OMNode detach() throws OMException{
- if(this.parentNode == null) {
- throw new OMException("Parent level elements cannot be ditached");
- } else {
- if(previousSibling == null) { // This is the first child
- if(nextSibling != null) {
- this.parentNode.setFirstChild(nextSibling);
- } else {
- this.parentNode.firstChild = null;
- this.parentNode.lastChild = null;
- }
- } else {
- ((OMNodeEx)this.getPreviousOMSibling()).setNextOMSibling(nextSibling);
- } if (this.nextSibling != null) {
- this.nextSibling.setPreviousOMSibling(this.previousSibling);
- }
- this.parentNode = null;
- }
- return this;
- }
-
- public void discard() throws OMException {
- throw new UnsupportedOperationException("Cannot discard this node");
- }
-
- /**
- * Insert the given sibling next to this item
- */
- public void insertSiblingAfter(OMNode sibling) throws OMException {
-
- if(this.parentNode != null) {
- ((OMNodeEx)sibling).setParent(this.parentNode);
- }
-
- if(sibling instanceof ChildNode) {
- ChildNode domSibling = (ChildNode)sibling;
- domSibling.previousSibling = this;
- if(this.nextSibling != null) {
- this.nextSibling.previousSibling = domSibling;
- }
- domSibling.nextSibling = this.nextSibling;
- this.nextSibling = domSibling;
-
- } else {
- throw new OMException("The given child is not of type " + ChildNode.class);
- }
- }
-
- /**
- * Insert the given sibling before this item
- */
- public void insertSiblingBefore(OMNode sibling) throws OMException {
+ public Node getPreviousSibling() {
+ return this.previousSibling;
+ }
+
+ ///
+ ///OMNode methods
+ ///
+ public void setNextOMSibling(OMNode node) {
+ if (node instanceof ChildNode)
+ this.nextSibling = (ChildNode) node;
+ else
+ throw new OMException("The node is not a " + ChildNode.class);
+ }
+
+ public void setPreviousOMSibling(OMNode node) {
+ if (node instanceof ChildNode)
+ this.previousSibling = (ChildNode) node;
+ else
+ throw new OMException("The node is not a " + ChildNode.class);
+ }
+
+ public OMContainer getParent() throws OMException {
+ return (OMContainer) this.parentNode;
+ }
+
+ public Node getParentNode() {
+ return this.parentNode;
+ }
+
+ public void setParent(OMContainer element) {
+ if (element instanceof ParentNode)
+ this.parentNode = (ParentNode) element;
+ else
+ throw new OMException("The given parent is not of the type " + ParentNode.class);
+
+ }
+
+ public OMNode detach() throws OMException {
+ if (this.parentNode == null) {
+ throw new OMException("Parent level elements cannot be ditached");
+ } else {
+ if (previousSibling == null) { // This is the first child
+ if (nextSibling != null) {
+ this.parentNode.setFirstChild(nextSibling);
+ } else {
+ this.parentNode.firstChild = null;
+ this.parentNode.lastChild = null;
+ }
+ } else if(nextSibling != null){
+ ((OMNodeEx) this.getPreviousOMSibling()).setNextOMSibling(nextSibling);
+ }
+ if (this.nextSibling != null) {
+ this.nextSibling.setPreviousOMSibling(this.previousSibling);
+ }
+ this.parentNode = null;
+ }
+ return this;
+ }
+
+ public void discard() throws OMException {
+ throw new UnsupportedOperationException("Cannot discard this node");
+ }
+
+ /**
+ * Insert the given sibling next to this item
+ */
+ public void insertSiblingAfter(OMNode sibling) throws OMException {
+
+ if (this.parentNode != null) {
+ ((OMNodeEx) sibling).setParent(this.parentNode);
+ }
+
+ if (sibling instanceof ChildNode) {
+ ChildNode domSibling = (ChildNode) sibling;
+ domSibling.previousSibling = this;
+ if (this.nextSibling != null) {
+ this.nextSibling.previousSibling = domSibling;
+ }
+ domSibling.nextSibling = this.nextSibling;
+ this.nextSibling = domSibling;
+
+ } else {
+ throw new OMException("The given child is not of type " + ChildNode.class);
+ }
+ }
+
+ /**
+ * Insert the given sibling before this item
+ */
+ public void insertSiblingBefore(OMNode sibling) throws OMException {
// ((OMNodeEx)sibling).setParent(this.parentNode);
- if(sibling instanceof ChildNode) {
+ if (sibling instanceof ChildNode) {
// ChildNode domSibling = (ChildNode)sibling;
// domSibling.nextSibling = this;
// if(this.previousSibling != null) {
@@ -162,24 +166,24 @@
siblingImpl.setPreviousOMSibling(previousSibling);
}
previousSibling = siblingImpl;
-
- } else {
- throw new OMException("The given child is not of type " + ChildNode.class);
- }
-
- }
-
-
+
+ } else {
+ throw new OMException("The given child is not of type " + ChildNode.class);
+ }
+
+ }
+
+
public Node cloneNode(boolean deep) {
- ChildNode newnode = (ChildNode) super.cloneNode(deep);
-
+ ChildNode newnode = (ChildNode) super.cloneNode(deep);
+
// Need to break the association w/ original kids
- newnode.previousSibling = null;
- newnode.nextSibling = null;
+ newnode.previousSibling = null;
+ newnode.nextSibling = null;
newnode.isFirstChild(false);
- return newnode;
+ return newnode;
}
}
Index: modules/xml/src/org/apache/axis2/om/FactoryFinder.java
===================================================================
--- modules/xml/src/org/apache/axis2/om/FactoryFinder.java (revision 365352)
+++ modules/xml/src/org/apache/axis2/om/FactoryFinder.java (working copy)
@@ -50,12 +50,12 @@
String factoryClassName = factoryClass;
//first look for a java system property
- if (System.getProperty(systemPropertyName) != null) {
+ if (systemPropertyName != null &&
+ System.getProperty(systemPropertyName) != null) {
factoryClassName = systemPropertyName;
}
- ;
- Object factory = null;
+ Object factory;
try {
if (loader == null) {
factory = Class.forName(factoryClassName).newInstance();
@@ -82,8 +82,8 @@
public static SOAPFactory findSOAP11Factory(ClassLoader loader)
throws OMFactoryException {
return (SOAPFactory) findFactory(loader,
- DEFAULT_SOAP11_FACTORY_CLASS_NAME,
- SOAP11_FACTORY_NAME_PROPERTY);
+ DEFAULT_SOAP11_FACTORY_CLASS_NAME,
+ SOAP11_FACTORY_NAME_PROPERTY);
}
/**
@@ -100,8 +100,8 @@
public static SOAPFactory findSOAP12Factory(ClassLoader loader)
throws OMFactoryException {
return (SOAPFactory) findFactory(loader,
- DEFAULT_SOAP12_FACTORY_CLASS_NAME,
- SOAP12_FACTORY_NAME_PROPERTY);
+ DEFAULT_SOAP12_FACTORY_CLASS_NAME,
+ SOAP12_FACTORY_NAME_PROPERTY);
}
/**
@@ -118,7 +118,20 @@
public static OMFactory findOMFactory(ClassLoader loader)
throws OMFactoryException {
return (OMFactory) findFactory(loader,
- DEFAULT_OM_FACTORY_CLASS_NAME,
- OM_FACTORY_NAME_PROPERTY);
+ DEFAULT_OM_FACTORY_CLASS_NAME,
+ OM_FACTORY_NAME_PROPERTY);
}
+
+ /**
+ *
+ * @param classLoader
+ * @param soapFactory
+ * @return The SOAPFactory
+ */
+ public static SOAPFactory findSOAPFactory(final ClassLoader classLoader,
+ final String soapFactory) {
+ return (SOAPFactory) findFactory(classLoader,
+ soapFactory,
+ null);
+ }
}
Index: modules/xml/src/org/apache/axis2/om/OMAbstractFactory.java
===================================================================
--- modules/xml/src/org/apache/axis2/om/OMAbstractFactory.java (revision 365352)
+++ modules/xml/src/org/apache/axis2/om/OMAbstractFactory.java (working copy)
@@ -50,6 +50,28 @@
}
/**
+ * This will pick up the provided <code>soapFactory</code> factory implementation from the classpath
+ *
+ * @param soapFactory Fully qualified SOAP 1.1 or SOAP 1.2 Factory implementation class name
+ * @return The SOAP 1.1 or 1.2 Factory implementation instance corresponding to <code>soapFactory</code>
+ */
+ public static SOAPFactory getSOAPFactory(String soapFactory) {
+ return FactoryFinder.findSOAPFactory(null, soapFactory);
+ }
+
+ /**
+ * This will pick up the provided <code>soapFactory</code> factory implementation using the provided
+ * <code>classLoader</code>
+ *
+ * @param classLoader
+ * @param soapFactory Fully qualified SOAP 1.1 or SOAP 1.2 Factory implementation class name
+ * @return The SOAP 1.1 or 1.2 Factory implementation instance corresponding to <code>soapFactory</code>
+ */
+ public static SOAPFactory getSOAPFactory(ClassLoader classLoader, String soapFactory) {
+ return FactoryFinder.findSOAPFactory(classLoader, soapFactory);
+ }
+
+ /**
* This will pick up the default factory implementation from the classpath
*
* @return
@@ -98,6 +120,8 @@
* So this method is to solve the chicken and egg problem, we have. If you do not know the SOAP version to be used
* to process a particluar SOAP message you have recd, use this method to buid the SOAP envelope, and then extract the SOAP
* version from that envlope and switch to the proper factory using that.
+ *
+ * @deprecated
*/
public static SOAPFactory getDefaultSOAPFactory() {
return new SOAPLinkedListImplFactory();
Index: modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java
===================================================================
--- modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java (revision 365352)
+++ modules/saaj/test/org/apache/axis2/saaj/AttachmentTest.java (working copy)
@@ -19,46 +19,46 @@
public AttachmentTest(String name) {
super(name);
}
-
+
public void testStringAttachment() throws Exception {
- SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
- SOAPConnection con = scFactory.createConnection();
-
- MessageFactory factory = MessageFactory.newInstance();
- SOAPMessage message = factory.createMessage();
- AttachmentPart attachment = message.createAttachmentPart();
- String stringContent = "Update address for Sunny Skies " +
- "Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";
-
- attachment.setContent(stringContent, "text/plain");
- attachment.setContentId("update_address");
- message.addAttachmentPart(attachment);
-
- assertTrue(message.countAttachments()==1);
-
- java.util.Iterator it = message.getAttachments();
- while (it.hasNext()) {
- attachment = (AttachmentPart) it.next();
- Object content = attachment.getContent();
- String id = attachment.getContentId();
- System.out.println("Attachment " + id + " contains: " + content);
- assertEquals(content,stringContent);
- }
- System.out.println("Here is what the XML message looks like:");
- message.writeTo(System.out);
-
- message.removeAllAttachments();
- assertTrue(message.countAttachments()==0);
+ SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
+ SOAPConnection con = scFactory.createConnection();
+
+ MessageFactory factory = MessageFactory.newInstance();
+ SOAPMessage message = factory.createMessage();
+ AttachmentPart attachment = message.createAttachmentPart();
+ String stringContent = "Update address for Sunny Skies " +
+ "Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";
+
+ attachment.setContent(stringContent, "text/plain");
+ attachment.setContentId("update_address");
+ message.addAttachmentPart(attachment);
+
+ assertTrue(message.countAttachments() == 1);
+
+ java.util.Iterator it = message.getAttachments();
+ while (it.hasNext()) {
+ attachment = (AttachmentPart) it.next();
+ Object content = attachment.getContent();
+ String id = attachment.getContentId();
+ System.out.println("Attachment " + id + " contains: " + content);
+ assertEquals(content, stringContent);
+ }
+ System.out.println("Here is what the XML message looks like:");
+ message.writeTo(System.out);
+
+ message.removeAllAttachments();
+ assertTrue(message.countAttachments() == 0);
}
-
+
public void testMultipleAttachments() throws Exception {
SOAPConnectionFactory scFactory = SOAPConnectionFactory.newInstance();
SOAPConnection con = scFactory.createConnection();
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage msg = factory.createMessage();
- java.net.URL url1 = new java.net.URL("http://slashdot.org/slashdot.xml");
- java.net.URL url2 = new java.net.URL("http://www.apache.org/LICENSE.txt");
+ java.net.URL url1 = new java.net.URL("http://www.apache.org/licenses/LICENSE-2.0.html");
+ java.net.URL url2 = new java.net.URL("http://www.apache.org/licenses/LICENSE-2.0.txt");
AttachmentPart a1 = msg.createAttachmentPart(new javax.activation.DataHandler(url1));
a1.setContentType("text/xml");
@@ -70,54 +70,58 @@
a3.setContentType("text/plain");
msg.addAttachmentPart(a3);
- assertTrue(msg.countAttachments()==3);
+ assertTrue(msg.countAttachments() == 3);
javax.xml.soap.MimeHeaders mimeHeaders = new javax.xml.soap.MimeHeaders();
mimeHeaders.addHeader("Content-Type", "text/xml");
int nAttachments = 0;
java.util.Iterator iterator = msg.getAttachments(mimeHeaders);
- while (iterator.hasNext()) {
+ while (iterator.hasNext()) {
nAttachments++;
- AttachmentPart ap = (AttachmentPart)iterator.next();
- assertTrue(ap.equals(a1) || ap.equals(a2));
- }
- assertTrue(nAttachments==2);
+ AttachmentPart ap = (AttachmentPart) iterator.next();
+ assertTrue(ap.equals(a1) || ap.equals(a2));
+ }
+ assertTrue(nAttachments == 2);
}
-
+
public void testBadAttSize() throws Exception {
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage();
- ByteArrayInputStream ins=new ByteArrayInputStream(new byte[5]);
- DataHandler dh=new DataHandler(new Src(ins,"text/plain"));
+ ByteArrayInputStream ins = new ByteArrayInputStream(new byte[5]);
+ DataHandler dh = new DataHandler(new Src(ins, "text/plain"));
AttachmentPart part = message.createAttachmentPart(dh);
- assertEquals("Size should match",5,part.getSize());
+ assertEquals("Size should match", 5, part.getSize());
}
- class Src implements DataSource{
+ class Src implements DataSource {
InputStream m_src;
String m_type;
- public Src(InputStream data, String type){
- m_src=data;
- m_type=type;
+ public Src(InputStream data, String type) {
+ m_src = data;
+ m_type = type;
}
- public String getContentType(){
+
+ public String getContentType() {
return m_type;
}
- public InputStream getInputStream() throws IOException{
+
+ public InputStream getInputStream() throws IOException {
m_src.reset();
return m_src;
}
- public String getName(){
+
+ public String getName() {
return "Some-Data";
}
- public OutputStream getOutputStream(){
+
+ public OutputStream getOutputStream() {
throw new UnsupportedOperationException("I don't give output streams");
}
}
-
+
public static void main(String[] args) throws Exception {
AttachmentTest tester = new AttachmentTest("TestSAAJ");
tester.testMultipleAttachments();
Index: modules/saaj/test-resources/Echo.aar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream