FileDocCategorySizeDatePackage
AttachmentPart.javaAPI DocApache Axis 1.419771Sat Apr 22 18:57:28 BST 2006org.apache.axis.attachments

AttachmentPart

public class AttachmentPart extends AttachmentPart implements org.apache.axis.Part
An attachment part.

Fields Summary
protected static Log
log
Field log
DataHandler
datahandler
The data handler.

TODO: make private?

private MimeHeaders
mimeHeaders
Field mimeHeaders.
private Object
contentObject
private String
attachmentFile
The name of a file used to store the data.
Constructors Summary
public AttachmentPart()
Bulds a new AttachmentPart.


             
      
        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, SessionUtils.generateSessionId());
    
public AttachmentPart(DataHandler dh)
Bulds a new AttachmentPart with a DataHandler.

param
dh the DataHandler

        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID,
                SessionUtils.generateSessionId());
        datahandler = dh;
        if(dh != null) {
            setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, dh.getContentType());
        javax.activation.DataSource ds = dh.getDataSource();
        if (ds instanceof ManagedMemoryDataSource) {
    	extractFilename((ManagedMemoryDataSource)ds); //and get the filename if appropriate

        }
        }
    
Methods Summary
public voidaddMimeHeader(java.lang.String header, java.lang.String value)
Add the specified MIME header, as per JAXM.

param
header
param
value

        mimeHeaders.addHeader(header, value);
    
public voidclearContent()
Clears out the content of this AttachmentPart object. The MIME header portion is left untouched.

        datahandler = null;
        contentObject = null;
    
public voiddetachAttachmentFile()
Detach the attachment file from this class, so it is not cleaned up. This has the side-effect of making subsequent calls to getAttachmentFile() return null.

        attachmentFile=null;
    
public synchronized voiddispose()
when an attachment part is disposed, any associated files are deleted, and the datahandler itself nulled. The object is no longer completely usable, at this point

        if (attachmentFile != null) {
            javax.activation.DataSource ds = datahandler.getDataSource();
            if (ds instanceof ManagedMemoryDataSource) {
                ((ManagedMemoryDataSource) ds).delete(); //and delete the file
            } else {
                File f = new File(attachmentFile);
                //no need to check for existence here.
                f.delete();
            }
            //set the filename to null to stop repeated use
            setAttachmentFile(null);
        }
        //clean up the datahandler, as it will have been
        //invalidated if it was bound to a file; if it wasnt
        //we get to release memory anyway
        datahandler = null;
    
private voidextractFilename(ManagedMemoryDataSource source)
Maybe add file name to the attachment.

param
source the source of the data

        //check for there being a file
        if(source.getDiskCacheFile()!=null) {
            String path = source.getDiskCacheFile().getAbsolutePath();
            setAttachmentFile(path);
        }
    
protected voidfinalize()
On death, we clean up our file.

throws
Throwable if anything went wrong during finalization

        dispose();
    
public javax.activation.DataHandlergetActivationDataHandler()
Get the data handler.

return
the activation DataHandler

        return datahandler;
    
public java.util.IteratorgetAllMimeHeaders()

        return mimeHeaders.getAllHeaders();
    
public java.lang.StringgetAttachmentFile()
Get the filename of this attachment.

return
the filename or null for an uncached file

        return attachmentFile;
    
public java.lang.ObjectgetContent()
Gets the content of this AttachmentPart object as a Java object. The type of the returned Java object depends on (1) the DataContentHandler object that is used to interpret the bytes and (2) the Content-Type given in the header.

For the MIME content types "text/plain", "text/html" and "text/xml", the DataContentHandler object does the conversions to and from the Java types corresponding to the MIME types. For other MIME types,the DataContentHandler object can return an InputStream object that contains the content data as raw bytes.

A JAXM-compliant implementation must, as a minimum, return a java.lang.String object corresponding to any content stream with a Content-Type value of text/plain and a javax.xml.transform.StreamSource object corresponding to a content stream with a Content-Type value of text/xml. For those content types that an installed DataContentHandler object does not understand, the DataContentHandler object is required to return a java.io.InputStream object with the raw bytes.

return
a Java object with the content of this AttachmentPart object
throws
SOAPException if there is no content set into this AttachmentPart object or if there was a data transformation error

        if(contentObject != null) {
            return contentObject;
        }

        if(datahandler == null) {
            throw new SOAPException(Messages.getMessage("noContent"));
        }

        javax.activation.DataSource ds = datahandler.getDataSource();
        InputStream is = null;
        try {
            is = ds.getInputStream();;
        } catch (java.io.IOException io) {
            log.error(Messages.getMessage("javaIOException00"), io);
            throw new SOAPException(io);
        }
        if (ds.getContentType().equals("text/plain")) {
            try {
                byte[] bytes = new byte[is.available()];
                IOUtils.readFully(is, bytes);
                return new String(bytes);
            } catch (java.io.IOException io) {
                log.error(Messages.getMessage("javaIOException00"), io);
                throw new SOAPException(io);
            }
        } else if (ds.getContentType().equals("text/xml")) {
            return new StreamSource(is);
        } else if (ds.getContentType().equals("image/gif") ||
                   ds.getContentType().equals("image/jpeg")) {
            try {
                return ImageIOFactory.getImageIO().loadImage(is);
            } catch (Exception ex) {
                log.error(Messages.getMessage("javaIOException00"), ex);
                throw new SOAPException(ex);
            }
        }
        return is;
    
public java.lang.StringgetContentId()

        return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_ID);
    
public java.lang.StringgetContentIdRef()
Content ID.

return
the contentId reference value that should be used directly as an href in a SOAP element to reference this attachment. Not part of JAX-RPC, JAX-M, SAAJ, etc.

      return Attachments.CIDprefix + getContentId();
    
public java.lang.StringgetContentLocation()

        return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION);
    
public java.lang.StringgetContentType()
getContentType

return
content type

        return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE);
    
public javax.activation.DataHandlergetDataHandler()
Gets the DataHandler object for this AttachmentPart object.

return
the DataHandler object associated with this AttachmentPart object
throws
SOAPException if there is no data in this AttachmentPart object

        if(datahandler == null) {
            throw new SOAPException(Messages.getMessage("noContent"));
        }
        return datahandler;
    
public java.lang.StringgetFirstMimeHeader(java.lang.String header)
Get the specified MIME header.

param
header
return

        String[] values = mimeHeaders.getHeader(header.toLowerCase());
        if ((values != null) && (values.length > 0)) {
            return values[0];
        }
        return null;
    
public java.util.IteratorgetMatchingMimeHeaders(java.lang.String[] match)

        return mimeHeaders.getMatchingHeaders(match);
    
public java.lang.String[]getMimeHeader(java.lang.String name)
Gets all the values of the header identified by the given String.

param
name the name of the header; example: "Content-Type"
return
a String array giving the value for the specified header
see
#setMimeHeader(java.lang.String, java.lang.String) setMimeHeader(java.lang.String, java.lang.String)

        return mimeHeaders.getHeader(name);
    
public java.util.IteratorgetNonMatchingMimeHeaders(java.lang.String[] match)

        return mimeHeaders.getNonMatchingHeaders(match);
    
public intgetSize()
Returns the number of bytes in this AttachmentPart object.

return
the size of this AttachmentPart object in bytes or -1 if the size cannot be determined
throws
SOAPException if the content of this attachment is corrupted of if there was an exception while trying to determine the size.

        if (datahandler == null) {
            return 0;
        }
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        try {
            datahandler.writeTo(bout);
        } catch (java.io.IOException ex) {
            log.error(Messages.getMessage("javaIOException00"), ex);
            throw new SOAPException(Messages.getMessage("javaIOException01", ex.getMessage()), ex);
        }
        return bout.size();
    
public booleanmatches(javax.xml.soap.MimeHeaders headers)
check if this Part's mimeheaders matches the one passed in. TODO: Am not sure about the logic.

param
headers the MimeHeaders to check
return
true if all header name, values in headers are found, false otherwise

        for (Iterator i = headers.getAllHeaders(); i.hasNext();) {
            javax.xml.soap.MimeHeader hdr = (javax.xml.soap.MimeHeader) i.next();
            String values[] = mimeHeaders.getHeader(hdr.getName());
            boolean found = false;
            if (values != null) {
                for (int j = 0; j < values.length; j++) {
                    if (!hdr.getValue().equalsIgnoreCase(values[j])) {
                        continue;
                    }
                    found = true;
                    break;
                }
            }
            if (!found) {
                return false;
            }
        }
        return true;
    
public voidremoveAllMimeHeaders()
Removes all the MIME header entries.

        mimeHeaders.removeAllHeaders();
    
public voidremoveMimeHeader(java.lang.String header)
Removes all MIME headers that match the given name.

param
header - the string name of the MIME header/s to be removed

        mimeHeaders.removeHeader(header);
    
protected voidsetAttachmentFile(java.lang.String path)
Set the filename of this attachment part.

param
path the new file path

        attachmentFile=path;
    
public voidsetContent(java.lang.Object object, java.lang.String contentType)
Sets the content of this attachment part to that of the given Object and sets the value of the Content-Type header to the given type. The type of the Object should correspond to the value given for the Content-Type. This depends on the particular set of DataContentHandler objects in use.

param
object the Java object that makes up the content for this attachment part
param
contentType the MIME string that specifies the type of the content
throws
java.lang.IllegalArgumentException if the contentType does not match the type of the content object, or if there was no DataContentHandler object for this content object
see
#getContent() getContent()

        ManagedMemoryDataSource source = null;
        setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, contentType);
        if (object instanceof String) {
            try {
                String s = (String) object;
                java.io.ByteArrayInputStream bais =
                        new java.io.ByteArrayInputStream(s.getBytes());
                source = new ManagedMemoryDataSource(bais,
                        ManagedMemoryDataSource.MAX_MEMORY_DISK_CACHED,
                        contentType, true);
                extractFilename(source);
                datahandler = new DataHandler(source);
                contentObject = object;
                return;
            } catch (java.io.IOException io) {
                log.error(Messages.getMessage("javaIOException00"), io);
                throw new java.lang.IllegalArgumentException(
                        Messages.getMessage("illegalArgumentException00"));
            }
        } else if (object instanceof java.io.InputStream) {
            try {
                source = new ManagedMemoryDataSource((java.io.InputStream) object,
                        ManagedMemoryDataSource.MAX_MEMORY_DISK_CACHED,
                        contentType, true);
                extractFilename(source);
                datahandler = new DataHandler(source);
                contentObject = null; // the stream has been consumed
                return;
            } catch (java.io.IOException io) {
                log.error(Messages.getMessage("javaIOException00"), io);
                throw new java.lang.IllegalArgumentException(Messages.getMessage
                        ("illegalArgumentException00"));
            }
        } else if (object instanceof StreamSource) {
            try {
                source = new ManagedMemoryDataSource(((StreamSource)object).getInputStream(),
                        ManagedMemoryDataSource.MAX_MEMORY_DISK_CACHED,
                        contentType, true);
                extractFilename(source);
                datahandler = new DataHandler(source);
                contentObject = null; // the stream has been consumed
                return;
            } catch (java.io.IOException io) {
                log.error(Messages.getMessage("javaIOException00"), io);
                throw new java.lang.IllegalArgumentException(Messages.getMessage
                        ("illegalArgumentException00"));
            }
        } else {
            throw new java.lang.IllegalArgumentException(
                    Messages.getMessage("illegalArgumentException00"));
        }
    
public voidsetContentId(java.lang.String newCid)

        setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, newCid);
    
public voidsetContentLocation(java.lang.String loc)

        setMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION, loc);
    
public voidsetDataHandler(javax.activation.DataHandler datahandler)
Sets the given DataHandler object as the data handler for this AttachmentPart object. Typically, on an incoming message, the data handler is automatically set. When a message is being created and populated with content, the setDataHandler method can be used to get data from various data sources into the message.

param
datahandler DataHandler object to be set
throws
java.lang.IllegalArgumentException if there was a problem with the specified DataHandler object

        if(datahandler == null) {
            throw new java.lang.IllegalArgumentException(
                Messages.getMessage("illegalArgumentException00"));
        }
        this.datahandler = datahandler;
        setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, datahandler.getContentType());
        //now look at the source of the data
        javax.activation.DataSource ds = datahandler.getDataSource();
        if (ds instanceof ManagedMemoryDataSource) {
            //and get the filename if appropriate
            extractFilename((ManagedMemoryDataSource)ds);
        }


    
public voidsetMimeHeader(java.lang.String name, java.lang.String value)
Changes the first header entry that matches the given name to the given value, adding a new header if no existing header matches. This method also removes all matching headers but the first.

Note that RFC822 headers can only contain US-ASCII characters.

param
name a String giving the name of the header for which to search
param
value a String giving the value to be set for the header whose name matches the given name
throws
java.lang.IllegalArgumentException if there was a problem with the specified mime header name or value

        mimeHeaders.setHeader(name, value);