blob: 39c9464487f72e96ff1563738db908698c9e85fb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.message;
import junit.framework.TestCase;
import org.apache.axiom.om.OMAttachmentAccessor;
import org.apache.axiom.om.OMDataSource;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axiom.om.OMSourcedElement;
import org.apache.axiom.om.OMXMLStreamReader;
import org.apache.axiom.om.util.CopyUtils;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.Constants;
import org.apache.axis2.Constants.Configuration;
import org.apache.axis2.datasource.jaxb.JAXBDataSource;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
import org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl;
import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.message.util.MessageUtils;
import org.apache.axis2.jaxws.providerapi.DataSourceImpl;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import org.test.mtom.ImageDepot;
import org.test.mtom.SendImage;
import test.EchoStringResponse;
import test.ObjectFactory;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.ImageInputStream;
import javax.xml.namespace.QName;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* These tests simulate the outbound processing
* from JAX-WS with Message Persistance. The tests validate that the
* message is properly cloned/written/read and that the OM is not
* unnecessarily expanded (which is a performance concern).
*/
public class MessagePersistanceTests extends TestCase {
DataSource stringDS, imageDS;
public String imageResourceDir = "test-resources" + File.separator + "image";
private final String sampleText = "Sample Text";
private final static QName XOP_INCLUDE =
new QName("http://www.w3.org/2004/08/xop/include", "Include");
protected void setUp() throws Exception {
super.setUp();
// Create a DataSource from a String
stringDS = new org.apache.axiom.attachments.ByteArrayDataSource(sampleText.getBytes(), "text/plain");
// Create a DataSource from an image
File file = new File(imageResourceDir + File.separator + "test.jpg");
ImageInputStream fiis = new FileImageInputStream(file);
Image image = ImageIO.read(fiis);
imageDS = new DataSourceImpl("image/jpeg", "test.jpg", image);
}
/**
* Create a JAXBBlock containing a JAX-B business object and simulate a normal Dispatch<Object>
* output flow
*
* @throws Exception
*/
public void testPersist_File() throws Exception {
// Create the JAX-B object that is typical from a JAX-WS app
String sampleJAXBText = "sample return value";
ObjectFactory of = new ObjectFactory();
EchoStringResponse obj = of.createEchoStringResponse();
obj.setEchoStringReturn("sample return value");
// The JAXB object is stored in the Axiom tree as an OMSourcedElement.
// The typical structure is
// OM SOAPEnvelope
// OM SOAPBody
// OMSourcedElement that is sourced by a JAXBBlockImpl which is backecd by a JAXB Object.
Message m = createMessage(obj);
// The Message is set on the JAXWS MessageContext
MessageContext jaxwsMC = new MessageContext();
jaxwsMC.setMessage(m);
// Check to see if the message is a fault. The engine will always call this method.
// The Message must respond appropriately without doing a conversion.
boolean isFault = m.isFault();
assertTrue(!isFault);
assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
"SPINE".equals(m.getXMLPartContentType()));
// The JAX-WS MessageContext is converted into an Axis2 MessageContext
org.apache.axis2.context.MessageContext axisMC = jaxwsMC.getAxisMessageContext();
MessageUtils.putMessageOnMessageContext(m, jaxwsMC.getAxisMessageContext());
// Add other properties to the MessageContext
axisMC.setProperty(Constants.JAXWS_WEBMETHOD_EXCEPTION, new NullPointerException());
axisMC.setProperty("keyString", "valueString");
axisMC.setProperty("keyInteger", new Integer(5));
// Make sure the Axiom structure is intact
SOAPEnvelope env = axisMC.getEnvelope();
SOAPBody body = env.getBody();
OMElement child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
OMSourcedElement omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
OMDataSource ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Now simulate persisting the message
File theFile = null;
String theFilename = null;
theFile = File.createTempFile("MessagePersistTest", null);
//theFile.deleteOnExit();
theFilename = theFile.getName();
System.out.println("temp file = [" + theFilename + "]");
// Setup an output stream to a physical file
FileOutputStream outStream = new FileOutputStream(theFile);
// Attach a stream capable of writing objects to the
// stream connected to the file
ObjectOutputStream outObjStream = new ObjectOutputStream(outStream);
// Try to save the message context
System.out.println("saving message context.....");
outObjStream.writeObject(axisMC);
// Close out the streams
outObjStream.flush();
outObjStream.close();
outStream.flush();
outStream.close();
System.out.println("....saved message context.....");
long filesize = theFile.length();
System.out.println("file size after save [" + filesize
+ "] temp file = [" + theFilename + "]");
// Make sure the Axiom structure is intact.
env = axisMC.getEnvelope();
body = env.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Simulate transport
ByteArrayOutputStream baos = new ByteArrayOutputStream();
env.serializeAndConsume(baos, new OMOutputFormat());
// To check that the output is correct, get the String contents of the
// reader
String newText = baos.toString();
System.out.println(newText);
assertTrue(newText.contains(sampleJAXBText));
assertTrue(newText.contains("soap"));
assertTrue(newText.contains("Envelope"));
assertTrue(newText.contains("Body"));
// Now read in the persisted message
// Setup an input stream to the file
FileInputStream inStream = new FileInputStream(theFile);
// attach a stream capable of reading objects from the
// stream connected to the file
ObjectInputStream inObjStream = new ObjectInputStream(inStream);
// try to restore the message context
System.out.println("restoring a message context.....");
org.apache.axis2.context.MessageContext restoredMC =
(org.apache.axis2.context.MessageContext) inObjStream.readObject();
inObjStream.close();
inStream.close();
System.out.println("....restored message context.....");
// At this point in time, the restoredMessage will be a full tree.
// TODO If this changes, please add more assertions here.
// Check persisted properties
// The exception might be persisted....but in the very least it should
// not cause an exception.
Throwable t = (Throwable) restoredMC.getProperty(Constants.JAXWS_WEBMETHOD_EXCEPTION);
assertTrue(t == null || t instanceof NullPointerException);
// Make sure the keyString property was persisted
String valueString = (String) restoredMC.getProperty("keyString");
assertTrue("valueString".equals(valueString));
// Make sure the keyInteger property was persisted.
Integer valueInteger = (Integer) restoredMC.getProperty("keyInteger");
assertTrue(valueInteger == 5);
axisMC.setProperty("keyInteger", new Integer(5));
// Simulate transport
baos = new ByteArrayOutputStream();
env = restoredMC.getEnvelope();
env.serializeAndConsume(baos, new OMOutputFormat());
String restoredText = baos.toString();
System.out.println(restoredText);
assertTrue(restoredText.contains(sampleJAXBText));
assertTrue(restoredText.contains("soap"));
assertTrue(restoredText.contains("Envelope"));
assertTrue(restoredText.contains("Body"));
assertTrue(restoredText.equals(newText));
}
/**
* Create a JAXBBlock containing a JAX-B business object and simulate a normal Dispatch<Object>
* output flow
*
* @throws Exception
*/
public void testPersist_InMemory() throws Exception {
// Create the JAX-B object that is typical from a JAX-WS app
String sampleJAXBText = "sample return value";
ObjectFactory of = new ObjectFactory();
EchoStringResponse obj = of.createEchoStringResponse();
obj.setEchoStringReturn("sample return value");
// The JAXB object is stored in the Axiom tree as an OMSourcedElement.
// The typical structure is
// OM SOAPEnvelope
// OM SOAPBody
// OMSourcedElement that is sourced by a JAXBBlockImpl which is backecd by a JAXB Object.
Message m = createMessage(obj);
// The Message is set on the JAXWS MessageContext
MessageContext jaxwsMC = new MessageContext();
jaxwsMC.setMessage(m);
// Check to see if the message is a fault. The engine will always call this method.
// The Message must respond appropriately without doing a conversion.
boolean isFault = m.isFault();
assertTrue(!isFault);
assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
"SPINE".equals(m.getXMLPartContentType()));
// The JAX-WS MessageContext is converted into an Axis2 MessageContext
org.apache.axis2.context.MessageContext axisMC = jaxwsMC.getAxisMessageContext();
MessageUtils.putMessageOnMessageContext(m, jaxwsMC.getAxisMessageContext());
// Make sure the Axiom structure is intact
SOAPEnvelope env = axisMC.getEnvelope();
SOAPBody body = env.getBody();
OMElement child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
OMSourcedElement omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
OMDataSource ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Now simulate persisting the message in memory
SOAPEnvelope env2 = CopyUtils.copy(env);
// Make sure the Axiom structure is intact.
env = axisMC.getEnvelope();
body = env.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Simulate transport
ByteArrayOutputStream baos = new ByteArrayOutputStream();
env.serializeAndConsume(baos, new OMOutputFormat());
// To check that the output is correct, get the String contents of the
// reader
String newText = baos.toString();
System.out.println(newText);
assertTrue(newText.contains(sampleJAXBText));
assertTrue(newText.contains("soap"));
assertTrue(newText.contains("Envelope"));
assertTrue(newText.contains("Body"));
// Now check the copied envelope
body = env2.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBDataSource);
// Simulate transport
baos = new ByteArrayOutputStream();
env2.serializeAndConsume(baos, new OMOutputFormat());
String restoredText = baos.toString();
System.out.println(restoredText);
assertTrue(restoredText.contains(sampleJAXBText));
assertTrue(restoredText.contains("soap"));
assertTrue(restoredText.contains("Envelope"));
assertTrue(restoredText.contains("Body"));
assertTrue(restoredText.equals(newText));
}
/**
* Create a JAXBBlock containing a JAX-B business object and simulate a normal Dispatch<Object>
* output flow
*
* @throws Exception
*/
public void testPersist_Attachments_File() throws Exception {
// TODO Add a SWARef and a raw attachment
// Create the JAX-B object with an attachment
// Create a DataHandler with the String DataSource object
DataHandler dataHandler = new DataHandler(stringDS);
//Store the data handler in ImageDepot bean
org.test.mtom.ObjectFactory of = new org.test.mtom.ObjectFactory();
ImageDepot imageDepot = new org.test.mtom.ObjectFactory().createImageDepot();
imageDepot.setImageData(dataHandler);
SendImage obj = of.createSendImage();
obj.setInput(imageDepot);
// The JAXB object is stored in the Axiom tree as an OMSourcedElement.
// The typical structure is
// OM SOAPEnvelope
// OM SOAPBody
// OMSourcedElement that is sourced by a JAXBBlockImpl which is backecd by a JAXB Object.
Message m = createMessage(obj);
m.setMTOMEnabled(true);
// The Message is set on the JAXWS MessageContext
MessageContext jaxwsMC = new MessageContext();
jaxwsMC.setMessage(m);
// Check to see if the message is a fault. The engine will always call this method.
// The Message must respond appropriately without doing a conversion.
boolean isFault = m.isFault();
assertTrue(!isFault);
assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
"SPINE".equals(m.getXMLPartContentType()));
// The JAX-WS MessageContext is converted into an Axis2 MessageContext
org.apache.axis2.context.MessageContext axisMC = jaxwsMC.getAxisMessageContext();
MessageUtils.putMessageOnMessageContext(m, jaxwsMC.getAxisMessageContext());
axisMC.setProperty(Configuration.ENABLE_MTOM, "true" );
// Make sure the Axiom structure is intact
SOAPEnvelope env = axisMC.getEnvelope();
SOAPBody body = env.getBody();
OMElement child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
OMSourcedElement omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
OMDataSource ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Now simulate persisting the message
File theFile = null;
String theFilename = null;
theFile = File.createTempFile("MessagePersistTest", null);
//theFile.deleteOnExit();
theFilename = theFile.getName();
System.out.println("temp file = [" + theFilename + "]");
// Setup an output stream to a physical file
FileOutputStream outStream = new FileOutputStream(theFile);
// Attach a stream capable of writing objects to the
// stream connected to the file
ObjectOutputStream outObjStream = new ObjectOutputStream(outStream);
// Try to save the message context
System.out.println("saving message context.....");
outObjStream.writeObject(axisMC);
// Close out the streams
outObjStream.flush();
outObjStream.close();
outStream.flush();
outStream.close();
System.out.println("....saved message context.....");
long filesize = theFile.length();
System.out.println("file size after save [" + filesize
+ "] temp file = [" + theFilename + "]");
// Make sure the Axiom structure is intact.
env = axisMC.getEnvelope();
body = env.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Simulate transport
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OMOutputFormat outputFormat = new OMOutputFormat();
outputFormat.setDoOptimize(true);
outputFormat.setMimeBoundary("MIMEBoundary_Axis2Rocks");
env.serializeAndConsume(baos, outputFormat);
// Make sure the output is correct
String newText = baos.toString();
System.out.println(newText);
assertTrue(newText.contains("soap"));
assertTrue(newText.contains("Envelope"));
assertTrue(newText.contains("Body"));
assertTrue(newText.indexOf("MIMEBoundary_Axis2Rocks") > 0);
assertTrue(newText.indexOf(sampleText) > 0);
assertTrue(newText.indexOf("<soapenv:Body><sendImage xmlns=\"urn://mtom.test.org\"><input><imageData><xop:Include") > 0);
// Now read in the persisted message
// Setup an input stream to the file
FileInputStream inStream = new FileInputStream(theFile);
// attach a stream capable of reading objects from the
// stream connected to the file
ObjectInputStream inObjStream = new ObjectInputStream(inStream);
// try to restore the message context
System.out.println("restoring a message context.....");
org.apache.axis2.context.MessageContext restoredMC =
(org.apache.axis2.context.MessageContext) inObjStream.readObject();
inObjStream.close();
inStream.close();
System.out.println("....restored message context.....");
// At this point in time, the restoredMessage will be a full tree.
// TODO If this changes, please add more assertions here.
// Simulate transport on the restored message
baos = new ByteArrayOutputStream();
env = restoredMC.getEnvelope();
outputFormat = new OMOutputFormat();
outputFormat.setDoOptimize(true);
outputFormat.setMimeBoundary("MIMEBoundary_Axis2Rocks");
env.serializeAndConsume(baos, outputFormat);
String restoredText = baos.toString();
System.out.println(restoredText);
assertTrue(restoredText.contains("soap"));
assertTrue(restoredText.contains("Envelope"));
assertTrue(restoredText.contains("Body"));
assertTrue(restoredText.indexOf("MIMEBoundary_Axis2Rocks") > 0);
assertTrue(restoredText.indexOf(sampleText) > 0);
assertTrue(restoredText.indexOf("<soapenv:Body><sendImage xmlns=\"urn://mtom.test.org\"><input><imageData><xop:Include") > 0);
// Now try walking the saved envelope as an XMLInputStream.
// try to restore the message context again
// Now read in the persisted message
// Setup an input stream to the file
inStream = new FileInputStream(theFile);
// attach a stream capable of reading objects from the
// stream connected to the file
inObjStream = new ObjectInputStream(inStream);
System.out.println("restoring a message context again.....");
restoredMC =
(org.apache.axis2.context.MessageContext) inObjStream.readObject();
inObjStream.close();
inStream.close();
System.out.println("....restored message context.....");
env = restoredMC.getEnvelope();
env.build();
// Use tree as input to XMLStreamReader
OMXMLStreamReader xmlStreamReader = (OMXMLStreamReader) env.getXMLStreamReader();
// Issue XOP:Include events for optimized MTOM text nodes
xmlStreamReader.setInlineMTOM(false);
DataHandler dh = null;
while(xmlStreamReader.hasNext()) {
xmlStreamReader.next();
if (xmlStreamReader.isStartElement()) {
QName qName =xmlStreamReader.getName();
if (XOP_INCLUDE.equals(qName)) {
String hrefValue = xmlStreamReader.getAttributeValue("", "href");
if (hrefValue != null) {
dh =((OMAttachmentAccessor)xmlStreamReader).getDataHandler(hrefValue);
}
}
}
}
assertTrue(dh != null);
}
/**
* Create a JAXBBlock containing a JAX-B business object and simulate a normal Dispatch<Object>
* output flow
*
* @throws Exception
*/
public void testPersist_Attachments_InMemory() throws Exception {
// TODO Add a SWARef and a raw attachment
// Create the JAX-B object with an attachment
// Create a DataHandler with the String DataSource object
DataHandler dataHandler = new DataHandler(stringDS);
//Store the data handler in ImageDepot bean
org.test.mtom.ObjectFactory of = new org.test.mtom.ObjectFactory();
ImageDepot imageDepot = new org.test.mtom.ObjectFactory().createImageDepot();
imageDepot.setImageData(dataHandler);
SendImage obj = of.createSendImage();
obj.setInput(imageDepot);
// The JAXB object is stored in the Axiom tree as an OMSourcedElement.
// The typical structure is
// OM SOAPEnvelope
// OM SOAPBody
// OMSourcedElement that is sourced by a JAXBBlockImpl which is backecd by a JAXB Object.
Message m = createMessage(obj);
m.setMTOMEnabled(true);
// The Message is set on the JAXWS MessageContext
MessageContext jaxwsMC = new MessageContext();
jaxwsMC.setMessage(m);
// Check to see if the message is a fault. The engine will always call this method.
// The Message must respond appropriately without doing a conversion.
boolean isFault = m.isFault();
assertTrue(!isFault);
assertTrue("XMLPart Representation is " + m.getXMLPartContentType(),
"SPINE".equals(m.getXMLPartContentType()));
// The JAX-WS MessageContext is converted into an Axis2 MessageContext
org.apache.axis2.context.MessageContext axisMC = jaxwsMC.getAxisMessageContext();
MessageUtils.putMessageOnMessageContext(m, jaxwsMC.getAxisMessageContext());
axisMC.setProperty(Configuration.ENABLE_MTOM, "true");
// Make sure the Axiom structure is intact
SOAPEnvelope env = axisMC.getEnvelope();
SOAPBody body = env.getBody();
OMElement child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
OMSourcedElement omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
OMDataSource ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Now simulate persisting the message in memory
SOAPEnvelope env2 = CopyUtils.copy(env);
// Make sure the Axiom structure is intact.
env = axisMC.getEnvelope();
body = env.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBBlockImpl);
// Simulate transport
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OMOutputFormat outputFormat = new OMOutputFormat();
outputFormat.setDoOptimize(true);
outputFormat.setMimeBoundary("MIMEBoundary_Axis2Rocks");
env.serializeAndConsume(baos, outputFormat);
String newText = baos.toString();
System.out.println(newText);
assertTrue(newText.contains("soap"));
assertTrue(newText.contains("Envelope"));
assertTrue(newText.contains("Body"));
assertTrue(newText.indexOf("MIMEBoundary_Axis2Rocks") > 0);
assertTrue(newText.indexOf(sampleText) > 0);
assertTrue(newText.indexOf("<soapenv:Body><sendImage xmlns=\"urn://mtom.test.org\"><input><imageData><xop:Include") > 0);
// Now check the copied envelope
body = env2.getBody();
child = body.getFirstElement();
assertTrue(child instanceof OMSourcedElement);
omse = (OMSourcedElement) child;
assertTrue(!omse.isExpanded());
ds = omse.getDataSource();
assertTrue(ds instanceof JAXBDataSource);
// Simulate transport on the copied message
baos = new ByteArrayOutputStream();
outputFormat = new OMOutputFormat();
outputFormat.setDoOptimize(true);
outputFormat.setMimeBoundary("MIMEBoundary_Axis2Rocks");
env2.serializeAndConsume(baos, outputFormat);
String restoredText = baos.toString();
System.out.println(restoredText);
assertTrue(restoredText.contains("soap"));
assertTrue(restoredText.contains("Envelope"));
assertTrue(restoredText.contains("Body"));
assertTrue(restoredText.indexOf("MIMEBoundary_Axis2Rocks") > 0);
// Make sure that attachment is not inlined
assertTrue(restoredText.indexOf(sampleText) > 0);
assertTrue(restoredText.indexOf("<soapenv:Body><sendImage xmlns=\"urn://mtom.test.org\"><input><imageData><xop:Include") > 0);
}
private Message createMessage(Object jaxbObj) throws Exception {
// Create a SOAP 1.1 Message
MessageFactory mf = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.create(Protocol.soap11);
// Get the BlockFactory
JAXBBlockFactory bf = (JAXBBlockFactory) FactoryRegistry.getFactory(JAXBBlockFactory.class);
// Create the JAXBContext
JAXBBlockContext context =
new JAXBBlockContext(jaxbObj.getClass().getPackage().getName());
// Create a JAXBBlock using the Echo object as the content. This simulates
// what occurs on the outbound JAX-WS Dispatch<Object> client
Block block = bf.createFrom(jaxbObj, context, null);
// Add the block to the message as normal body content.
m.setBodyBlock(block);
return m;
}
}