Greg,
To be honest, I don't know the answer to your question off the top of my head, but
this might be of help to you.....I have been doing a lot of research on attachments of
late. I have learnt that returning a DataHandler is not a good way because of
interoperability issues. The best practice is not to pass complex language depentant
objects across the wire like for example - DataHandler in this case. If anybody finds
my understanding incorrect please feel free to correct me. So, I found an alternative
way of sending attachments back and forth -
Server side code-
public void ping(String msg)
{
System.out.println("In the new rebuilt ping
method.....................................");
Multipart multiPart = null;
try
{
FileInputStream fin = new
FileInputStream("C:\\workarea\\webservices\\bluesWebService\\test.pdf");
int avl = fin.available();
byte[] buf = new byte[avl];
ByteArrayInputStream bin = new ByteArrayInputStream(buf);
bin.read();
ByteArrayDataSource bds = new ByteArrayDataSource(buf,"application/pdf");
DataHandler dh = new DataHandler(bds);
fin.close();
fin = new FileInputStream("C:\\workarea\\etrac\\Web
Content\\images\\b_complete.gif");
avl = fin.available();
buf = new byte[avl];
bin = new ByteArrayInputStream(buf);
bin.read();
ByteArrayDataSource bds1 = new ByteArrayDataSource(buf,"image/gif");
DataHandler dh1 = new DataHandler(bds1);
fin.close();
org.apache.axis.MessageContext messageContext =
org.apache.axis.MessageContext.getCurrentContext();
org.apache.axis.Message responseMessage = messageContext.getResponseMessage();
//responseMessage.getAttachmentsImpl().setSendType(org.apache.axis.attachments.Attachments.SEND_TYPE_DIME);
responseMessage.addAttachmentPart(new AttachmentPart(dh));
responseMessage.addAttachmentPart(new AttachmentPart(dh1));
System.out.println("finished attaching the PDF to the response");
}
catch (Exception e)
{
e.printStackTrace();
}
}
Client side code -
String[] array = new String[1];
array[0] = "hello";
String returnValue = (String) call.invoke(array);
System.out.println("The return value is -> "+returnValue);
org.apache.axis.MessageContext messageContext = call.getMessageContext();
org.apache.axis.Message returnedMessage =
messageContext.getResponseMessage();
System.out.println("Number of attachments is ->
"+returnedMessage.countAttachments());
returnedMessage.getAttachments();
Hope this information helps you.
Thanks
Srinivas
-----Original Message-----
From: Greg Hess [mailto:[EMAIL PROTECTED]
Sent: Tuesday, November 11, 2003 1:50 PM
To: [EMAIL PROTECTED]
Subject: RE: Custom mapping's and DataHandlers?
Many Thanks,
I have been studying the echoAttachments sample. Unfortunately I want to adapt the use
of attachments to work with my existing assets. I currently have an operation that has
a returnType="CustomBean" this "CustomBean" has a property that accesses a byte[]. I
would like to be able to maintain the same service signature but alter my "CustomBean"
to access a DataHandler instead of the byte[].
Are attachments only supported as outlined in the echoAttachments sample where the
service defines a returnType="DataHandler" where the DataHandler must be the root of
the service response or request definition?
Would a custom Serializer/Deserializer support this functionality?
Thanks for your time,
Greg
> -----Original Message-----
> From: I-Sampige, Srinivas [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, November 11, 2003 3:52 PM
> To: [EMAIL PROTECTED]
> Subject: RE: Custom mapping's and DataHandlers?
>
> Here is how I returned a data handler from my web service method (a
great
> resource for you would be to look at the echoAttachments sampple that
> comes with Axis) -
>
> My WSSD -
> <service name="NoAttachment" provider="java:RPC">
> <operation name="ping" returnQName="returnqname"
returnType="DataHandler">
> <parameter name="op1" type="xsd:string"/>
> </operation>
> <parameter name="allowedMethods" value="*"/>
> <parameter name="className"
> value="com.boeing.cuis.webservices.NoAttachment"/>
> <typeMapping
>
deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFac
to
> ry"
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> qname="DataHandler"
>
serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory
"
> type="java:javax.activation.DataHandler"/>
> </service>
>
> MY client side code -
> file://String endPoint =
> "http://localhost:7080/cuis/services/urn:NoAttachment";
> String endPoint =
> "http://localhost:7080/cuis/services/NoAttachment";
> String method = "sendMailWithAttachment";
> System.out.println("calling web service at - "+endPoint);
> try
> {
> Service service = new Service();
> org.apache.axis.client.Call call =
> (org.apache.axis.client.Call) service.createCall();
> call.setTargetEndpointAddress(new java.net.URL(endPoint));
> //////// ping
> System.out.println("pinging the service..with an
attachement");
> call.setOperationName(new QName("NoAttachment", "ping"));
> QName qnameAttachment = new QName("NoAttachment",
> "DataHandler");
> call.registerTypeMapping(DataHandler.class, file://Add
> serializer for attachment.
> qnameAttachment,
>
JAFDataHandlerSerializerFactory.class,
>
> JAFDataHandlerDeserializerFactory.class);
> call.addParameter( "op1", XMLType.XSD_STRING,
ParameterMode.IN);
> call.setReturnType(qnameAttachment);
>
>
file://call.setProperty(Call.ATTACHMENT_ENCAPSULATION_FORMAT,Call.ATTACH
ME
> NT_ENCAPSULATION_FORMAT_DIME);
> String[] array = new String[1];
> array[0] = "hello";
> DataHandler returnValue = (DataHandler) call.invoke(array);
> System.out.println("The return value is -> "+returnValue);
>
>
> -----Original Message-----
> From: Greg Hess [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, November 11, 2003 11:58 AM
> To: [EMAIL PROTECTED]
> Subject: Custom mapping's and DataHandlers?
>
>
> Hi,
>
> One of the return classes of my service contains a large byte[]. I
would
> like to have the byte[] sent as an attachment. Following some examples
I
> have implemented this by hand and sent the byte[] as an attachment and
> just set the byte[] to null before the response is sent. The client
then
> manually grabs the attachment.
>
> Preferably I would like this done automatically. I think I can achieve
> this is by:
>
> 1) Have my service return a new wrapper class that converts the
> byte[] property to a DataHandler
> 2) Convert the classes <beanMapping> to a compete <typeMapping>
> defining the DataHandler property
>
> Unfortunately I am having great difficulty finding any resources
outlining
> this type of <typeMapping> and use of a DataHandler.
>
> Is this is even possible?
>
> Any help is greatly appreciated
>
> Greg Hess
> Software Engineer
> Wrapped Apps Corporation
> 275 Michael Cowpland Dr.
> Suite 201
> Ottawa, Ontario
> K2M 2G2
> Tel: (613) 591 -7552
> Fax: (613) 591-0523
> 1 (877) 388-6742
> www.wrappedapps.com
>
>
>