/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed 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 samples.attachments;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.activation.DataHandler;
/**
* @author Rick Rineholt
*/
/**
* An example of
* This class has a main method that beside the standard arguments
* allows you to specify an attachment that will be sent to a
* service which will then send it back.
*
*/
public class EchoAttachmentsService {
/**
* This method implements a web service that sends back
* any attachment it receives.
*/
public DataHandler echo( DataHandler dh) {
System.err.println("In echo");
//Attachments are sent by default back as a MIME stream if no attachments were
// received. If attachments are received the same format that was received will
// be the default stream type for any attachments sent.
//The following two commented lines would force any attachments sent back.
// to be in DIME format.
//Message rspmsg=AxisEngine.getCurrentMessageContext().getResponseMessage();
//rspmsg.getAttachmentsImpl().setSendType(org.apache.axis.attachments.Attachments.SEND_TYPE_DIME);
if (dh == null ) System.err.println("dh is null");
else System.err.println("Received \""+dh.getClass().getName()+"\".");
return dh;
}
/**
* This method implements a web service that sends back
* an array of attachment it receives.
*/
public DataHandler[] echoDir( DataHandler[] attachments) {
System.err.println("In echoDir");
//Attachments are sent by default back as a MIME stream if no attachments were
// received. If attachments are received the same format that was received will
// be the default stream type for any attachments sent.
//The following two commented lines would force any attachments sent back.
// to be in DIME format.
//Message rspmsg=AxisEngine.getCurrentMessageContext().getResponseMessage();
//rspmsg.getAttachmentsImpl().setSendType(org.apache.axis.attachments.Attachments.SEND_TYPE_DIME);
if (attachments == null ) System.err.println("attachments is null!");
else System.err.println("Got " + attachments.length + " attachments!");
return attachments;
}
public Document attachments( Document xml)
throws org.apache.axis.AxisFault,java.io.IOException, org.xml.sax.SAXException,
java.awt.datatransfer.UnsupportedFlavorException,javax.xml.parsers.ParserConfigurationException,
java.lang.ClassNotFoundException,javax.xml.soap.SOAPException {
System.err.println("In message handling attachments directly.");
org.apache.axis.MessageContext msgContext= org.apache.axis.MessageContext.getCurrentContext();
org.apache.axis.Message reqMsg= msgContext.getRequestMessage();
org.apache.axis.attachments.Attachments attachments=reqMsg.getAttachmentsImpl();
if(null == attachments){
throw new org.apache.axis.AxisFault("No support for attachments" );
}
Element rootEl= xml.getDocumentElement();
Element caEl= getNextFirstChildElement(rootEl);
StringBuffer fullmsg= new StringBuffer();
java.util.Vector reply= new java.util.Vector();
for(int count=1 ;caEl != null; caEl= getNextSiblingElement(caEl), ++count){
String href= caEl.getAttribute("href");
org.apache.axis.Part p= attachments.getAttachmentByReference(href);
if(null == p)
throw new org.apache.axis.AxisFault("Attachment for ref='"+href+"' not found." );
String ordinalStr =getOrdinalHeaders(p);
if( null == ordinalStr || ordinalStr.trim().length()==0)
throw new org.apache.axis.AxisFault("Ordinal for attachment ref='"+href+"' not found." );
int ordinal= Integer.parseInt(ordinalStr);
if(count != ordinal)
throw new org.apache.axis.AxisFault("Ordinal for attachment ref='"+href+"' excpected" + count + " got " + ordinal +"." );
//check content type.
if(!"text/plain".equals(p.getContentType()))
throw new org.apache.axis.AxisFault("Attachment ref='"+href+"' bad content-type:'"+p.getContentType()+"'." );
//now get at the data...
DataHandler dh= ((org.apache.axis.attachments.AttachmentPart)p).getDataHandler();
String pmsg=(String )dh.getContent();
fullmsg.append(pmsg);
reply.add(pmsg);
}
if(!(samples.attachments.TestRef .TheKey.equals(fullmsg.toString())))
throw new org.apache.axis.AxisFault("Fullmsg not correct'"+fullmsg +"'." );
System.out.println(fullmsg.toString());
//Now lets Java serialize the reply...
java.io.ByteArrayOutputStream byteStream = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(byteStream);
oos.writeObject(reply);
oos.close();
byte[] replyJavaSerialized= byteStream.toByteArray();
byteStream=null; oos= null;
org.apache.axis.attachments.AttachmentPart replyPart= new
org.apache.axis.attachments.AttachmentPart(
new DataHandler( new MemoryOnlyDataSource(replyJavaSerialized,
java.awt.datatransfer.DataFlavor.javaSerializedObjectMimeType+"; class=\""
+ reply.getClass().getName()+"\"")));
//Now lets add the attachment to the response message.
org.apache.axis.Message rspMsg= msgContext.getResponseMessage();
rspMsg.addAttachmentPart(replyPart);
//Iterate over the attachments... not by reference.
String ordinalPattern="";
for(java.util.Iterator ai=reqMsg.getAttachments(); ai.hasNext();){
org.apache.axis.Part p= (org.apache.axis.Part) ai.next();
ordinalPattern += getOrdinalHeaders(p);
}
//Now build the return document in a string buffer...
StringBuffer msgBody = new StringBuffer("\n<attachments xmlns=\"");
msgBody.append(rootEl.getNamespaceURI())
.append("\">\n")
.append("\t<attachment href=\"")
.append(replyPart.getContentIdRef())
.append("\" ordinalPattern=\"")
.append(ordinalPattern)
.append("\"/>\n")
.append("</attachments>\n");
//Convert the string buffer to an XML document and return it.
return
org.apache.axis.utils.XMLUtils.newDocument(
new org.xml.sax.InputSource(new java.io.ByteArrayInputStream(
msgBody.toString().getBytes())));
}
Element getNextFirstChildElement(Node n) {
if(n== null) return null;
n= n.getFirstChild();
for(; n!= null && !(n instanceof Element); n= n.getNextSibling());
return (Element)n;
}
Element getNextSiblingElement(Node n) {
if(n== null) return null;
n= n.getNextSibling();
for(; n!= null && !(n instanceof Element); n= n.getNextSibling());
return (Element)n;
}
String getOrdinalHeaders( org.apache.axis.Part p){
StringBuffer ret= new StringBuffer();
for(java.util.Iterator i= p.getMatchingMimeHeaders( new String[]{samples.attachments.TestRef.positionHTTPHeader});
i.hasNext();){
javax.xml.soap.MimeHeader mh= (javax.xml.soap.MimeHeader) i.next();
String v= mh.getValue();
if(v != null) ret.append(v.trim());
}
return ret.toString();
}
/**This class should store all attachment data in memory */
static class MemoryOnlyDataSource extends org.apache.axis.attachments.ManagedMemoryDataSource{
MemoryOnlyDataSource( byte [] in, String contentType) throws java.io.IOException{
super( new java.io.ByteArrayInputStream( in) , Integer.MAX_VALUE -2, contentType, true);
}
MemoryOnlyDataSource( String in, String contentType)throws java.io.IOException{
this( in.getBytes() , contentType);
}
}
}