duke@1: /* tbell@45: * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. Sun designates this duke@1: * particular file as subject to the "Classpath" exception as provided duke@1: * by Sun in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ tbell@45: /* tbell@45: * $Id: AttachmentPartImpl.java,v 1.1.1.1.2.1 2007/11/27 07:19:29 kumarjayanti Exp $ tbell@45: * $Revision: 1.1.1.1.2.1 $ tbell@45: * $Date: 2007/11/27 07:19:29 $ tbell@45: */ tbell@45: tbell@45: duke@1: package com.sun.xml.internal.messaging.saaj.soap; duke@1: duke@1: import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; duke@1: duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.util.ASCIIUtility; duke@1: duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.Header; duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimePartDataSource; duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.InternetHeaders; duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeBodyPart; duke@1: import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility; duke@1: import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; duke@1: import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; duke@1: duke@1: import javax.activation.CommandMap; duke@1: import javax.activation.DataHandler; duke@1: import javax.activation.MailcapCommandMap; duke@1: import javax.xml.soap.AttachmentPart; duke@1: import javax.xml.soap.MimeHeader; duke@1: import javax.xml.soap.MimeHeaders; duke@1: import javax.xml.soap.SOAPException; duke@1: import java.io.IOException; duke@1: import java.io.InputStream; duke@1: import java.io.ByteArrayOutputStream; duke@1: import java.io.ByteArrayInputStream; duke@1: import java.io.OutputStream; duke@1: import java.util.Iterator; duke@1: import java.util.List; duke@1: import java.util.logging.Level; duke@1: import java.util.logging.Logger; duke@1: duke@1: import javax.activation.*; duke@1: import javax.xml.soap.*; duke@1: duke@1: /** duke@1: * Implementation of attachments. duke@1: * duke@1: * @author Anil Vijendran (akv@eng.sun.com) duke@1: */ duke@1: public class AttachmentPartImpl extends AttachmentPart { duke@1: tbell@50: protected static final Logger log = duke@1: Logger.getLogger(LogDomainConstants.SOAP_DOMAIN, duke@1: "com.sun.xml.internal.messaging.saaj.soap.LocalStrings"); duke@1: duke@1: static { duke@1: try { duke@1: CommandMap map = CommandMap.getDefaultCommandMap(); duke@1: if (map instanceof MailcapCommandMap) { duke@1: MailcapCommandMap mailMap = (MailcapCommandMap) map; duke@1: String hndlrStr = ";;x-java-content-handler="; duke@1: mailMap.addMailcap( duke@1: "text/xml" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); duke@1: mailMap.addMailcap( duke@1: "application/xml" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); duke@1: mailMap.addMailcap( duke@1: "application/fastinfoset" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler"); tbell@45: /* Image DataContentHandler handles all image types duke@1: mailMap.addMailcap( duke@1: "image/jpeg" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.JpegDataContentHandler"); duke@1: mailMap.addMailcap( duke@1: "image/gif" duke@1: + hndlrStr tbell@45: + "com.sun.xml.internal.messaging.saaj.soap.GifDataContentHandler");*/ duke@1: /*mailMap.addMailcap( duke@1: "multipart/*" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");*/ duke@1: mailMap.addMailcap( duke@1: "image/*" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler"); duke@1: mailMap.addMailcap( duke@1: "text/plain" duke@1: + hndlrStr duke@1: + "com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler"); duke@1: } else { duke@1: throw new SOAPExceptionImpl("Default CommandMap is not a MailcapCommandMap"); duke@1: } duke@1: } catch (Throwable t) { duke@1: log.log( duke@1: Level.SEVERE, duke@1: "SAAJ0508.soap.cannot.register.handlers", duke@1: t); duke@1: if (t instanceof RuntimeException) { duke@1: throw (RuntimeException) t; duke@1: } else { duke@1: throw new RuntimeException(t.getLocalizedMessage()); duke@1: } duke@1: } duke@1: }; duke@1: duke@1: private final MimeHeaders headers; duke@1: private MimeBodyPart rawContent = null; duke@1: private DataHandler dataHandler = null; duke@1: duke@1: public AttachmentPartImpl() { duke@1: headers = new MimeHeaders(); duke@1: } duke@1: duke@1: public int getSize() throws SOAPException { duke@1: byte[] bytes; duke@1: duke@1: if ((rawContent == null) && (dataHandler == null)) duke@1: return 0; duke@1: duke@1: if (rawContent != null) { duke@1: try { duke@1: return rawContent.getSize(); duke@1: } catch (Exception ex) { duke@1: log.log( duke@1: Level.SEVERE, duke@1: "SAAJ0573.soap.attachment.getrawbytes.ioexception", duke@1: new String[] { ex.getLocalizedMessage()}); duke@1: throw new SOAPExceptionImpl("Raw InputStream Error: " + ex); duke@1: } duke@1: } else { duke@1: ByteOutputStream bout = new ByteOutputStream(); duke@1: try { duke@1: dataHandler.writeTo(bout); duke@1: } catch (IOException ex) { duke@1: log.log( duke@1: Level.SEVERE, duke@1: "SAAJ0501.soap.data.handler.err", duke@1: new String[] { ex.getLocalizedMessage()}); duke@1: throw new SOAPExceptionImpl("Data handler error: " + ex); duke@1: } duke@1: bytes = bout.getBytes(); duke@1: if (bytes != null) duke@1: return bytes.length; duke@1: } duke@1: return -1; duke@1: } duke@1: duke@1: public void clearContent() { duke@1: dataHandler = null; duke@1: rawContent = null; duke@1: } duke@1: duke@1: public Object getContent() throws SOAPException { duke@1: try { duke@1: if (dataHandler != null) { duke@1: return getDataHandler().getContent(); duke@1: } else if (rawContent != null) { duke@1: return rawContent.getContent(); duke@1: } else { duke@1: log.severe("SAAJ0572.soap.no.content.for.attachment"); duke@1: throw new SOAPExceptionImpl("No data handler/content associated with this attachment"); duke@1: } duke@1: } catch (Exception ex) { duke@1: log.log(Level.SEVERE, "SAAJ0575.soap.attachment.getcontent.exception", ex); duke@1: throw new SOAPExceptionImpl(ex.getLocalizedMessage()); duke@1: } duke@1: } duke@1: duke@1: public void setContent(Object object, String contentType) duke@1: throws IllegalArgumentException { duke@1: DataHandler dh = new DataHandler(object, contentType); duke@1: duke@1: setDataHandler(dh); duke@1: } duke@1: duke@1: duke@1: public DataHandler getDataHandler() throws SOAPException { duke@1: if (dataHandler == null) { duke@1: if (rawContent != null) { duke@1: return new DataHandler(new MimePartDataSource(rawContent)); duke@1: } duke@1: log.severe("SAAJ0502.soap.no.handler.for.attachment"); duke@1: throw new SOAPExceptionImpl("No data handler associated with this attachment"); duke@1: } duke@1: return dataHandler; duke@1: } duke@1: duke@1: public void setDataHandler(DataHandler dataHandler) duke@1: throws IllegalArgumentException { duke@1: if (dataHandler == null) { duke@1: log.severe("SAAJ0503.soap.no.null.to.dataHandler"); duke@1: throw new IllegalArgumentException("Null dataHandler argument to setDataHandler"); duke@1: } duke@1: this.dataHandler = dataHandler; duke@1: rawContent = null; duke@1: duke@1: log.log( duke@1: Level.FINE, duke@1: "SAAJ0580.soap.set.Content-Type", duke@1: new String[] { dataHandler.getContentType()}); duke@1: setMimeHeader("Content-Type", dataHandler.getContentType()); duke@1: } duke@1: duke@1: public void removeAllMimeHeaders() { duke@1: headers.removeAllHeaders(); duke@1: } duke@1: duke@1: public void removeMimeHeader(String header) { duke@1: headers.removeHeader(header); duke@1: } duke@1: duke@1: public String[] getMimeHeader(String name) { duke@1: return headers.getHeader(name); duke@1: } duke@1: duke@1: public void setMimeHeader(String name, String value) { duke@1: headers.setHeader(name, value); duke@1: } duke@1: duke@1: public void addMimeHeader(String name, String value) { duke@1: headers.addHeader(name, value); duke@1: } duke@1: duke@1: public Iterator getAllMimeHeaders() { duke@1: return headers.getAllHeaders(); duke@1: } duke@1: duke@1: public Iterator getMatchingMimeHeaders(String[] names) { duke@1: return headers.getMatchingHeaders(names); duke@1: } duke@1: duke@1: public Iterator getNonMatchingMimeHeaders(String[] names) { duke@1: return headers.getNonMatchingHeaders(names); duke@1: } duke@1: duke@1: boolean hasAllHeaders(MimeHeaders hdrs) { duke@1: if (hdrs != null) { duke@1: Iterator i = hdrs.getAllHeaders(); duke@1: while (i.hasNext()) { duke@1: MimeHeader hdr = (MimeHeader) i.next(); duke@1: String[] values = headers.getHeader(hdr.getName()); duke@1: boolean found = false; duke@1: duke@1: if (values != null) { duke@1: for (int j = 0; j < values.length; j++) duke@1: if (hdr.getValue().equalsIgnoreCase(values[j])) { duke@1: found = true; duke@1: break; duke@1: } duke@1: } duke@1: duke@1: if (!found) { duke@1: return false; duke@1: } duke@1: } duke@1: } duke@1: return true; duke@1: } duke@1: duke@1: MimeBodyPart getMimePart() throws SOAPException { duke@1: try { duke@1: if (rawContent != null) { duke@1: copyMimeHeaders(headers, rawContent); duke@1: return rawContent; duke@1: } duke@1: duke@1: MimeBodyPart envelope = new MimeBodyPart(); duke@1: duke@1: envelope.setDataHandler(dataHandler); duke@1: copyMimeHeaders(headers, envelope); duke@1: duke@1: return envelope; duke@1: } catch (Exception ex) { duke@1: log.severe("SAAJ0504.soap.cannot.externalize.attachment"); duke@1: throw new SOAPExceptionImpl("Unable to externalize attachment", ex); duke@1: } duke@1: } duke@1: duke@1: public static void copyMimeHeaders(MimeHeaders headers, MimeBodyPart mbp) duke@1: throws SOAPException { duke@1: duke@1: Iterator i = headers.getAllHeaders(); duke@1: duke@1: while (i.hasNext()) duke@1: try { duke@1: MimeHeader mh = (MimeHeader) i.next(); duke@1: duke@1: mbp.setHeader(mh.getName(), mh.getValue()); duke@1: } catch (Exception ex) { duke@1: log.severe("SAAJ0505.soap.cannot.copy.mime.hdr"); duke@1: throw new SOAPExceptionImpl("Unable to copy MIME header", ex); duke@1: } duke@1: } duke@1: duke@1: public static void copyMimeHeaders(MimeBodyPart mbp, AttachmentPartImpl ap) duke@1: throws SOAPException { duke@1: try { duke@1: List hdr = mbp.getAllHeaders(); duke@1: int sz = hdr.size(); duke@1: for( int i=0; i