/* * 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); } } }