package org.jboss.axis.attachments;
import org.jboss.axis.Part;
import org.jboss.axis.components.image.ImageIOFactory;
import org.jboss.axis.transport.http.HTTPConstants;
import org.jboss.axis.utils.IOUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.axis.utils.SessionUtils;
import org.jboss.logging.Logger;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.internet.MimeMultipart;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import javax.xml.transform.stream.StreamSource;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
public class AttachmentPartImpl extends AttachmentPart implements Part
{
private static Logger log = Logger.getLogger(AttachmentPartImpl.class.getName());
private DataHandler datahandler = null;
private MimeHeaders mimeHeaders = new MimeHeaders();
private Object contentObject;
public AttachmentPartImpl()
{
setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, SessionUtils.generateSessionId());
}
public AttachmentPartImpl(DataHandler dh)
{
setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, SessionUtils.generateSessionId());
datahandler = dh;
if (dh != null)
setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, dh.getContentType());
}
public DataHandler getActivationDataHandler()
{
return datahandler;
}
public String getContentType()
{
return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE);
}
public void setContentType(String contentType)
{
super.setContentType(contentType);
setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, contentType);
}
public void addMimeHeader(String header, String value)
{
mimeHeaders.addHeader(header, value);
}
public String getFirstMimeHeader(String header)
{
String[] values = mimeHeaders.getHeader(header.toLowerCase());
if ((values != null) && (values.length > 0))
{
return values[0];
}
return null;
}
public boolean matches(javax.xml.soap.MimeHeaders headers)
{
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 String getContentLocation()
{
return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION);
}
public void setContentLocation(String loc)
{
setMimeHeader(HTTPConstants.HEADER_CONTENT_LOCATION, loc);
}
public void setContentId(String newCid)
{
setMimeHeader(HTTPConstants.HEADER_CONTENT_ID, newCid);
}
public String getContentId()
{
return getFirstMimeHeader(HTTPConstants.HEADER_CONTENT_ID);
}
public java.util.Iterator getMatchingMimeHeaders(final String[] match)
{
return mimeHeaders.getMatchingHeaders(match);
}
public java.util.Iterator getNonMatchingMimeHeaders(final String[] match)
{
return mimeHeaders.getNonMatchingHeaders(match);
}
public Iterator getAllMimeHeaders()
{
return mimeHeaders.getAllHeaders();
}
public void setMimeHeader(String name, String value)
{
mimeHeaders.setHeader(name, value);
}
public void removeAllMimeHeaders()
{
mimeHeaders.removeAllHeaders();
}
public void removeMimeHeader(String header)
{
mimeHeaders.removeHeader(header);
}
public DataHandler getDataHandler() throws SOAPException
{
if (datahandler == null)
{
throw new SOAPException(Messages.getMessage("noContent"));
}
return datahandler;
}
public void setDataHandler(DataHandler datahandler)
{
if (datahandler == null)
{
throw new IllegalArgumentException(Messages.getMessage("illegalArgumentException00"));
}
this.datahandler = datahandler;
setMimeHeader(HTTPConstants.HEADER_CONTENT_TYPE, datahandler.getContentType());
}
public Object getContent() throws SOAPException
{
if (contentObject != null)
return contentObject;
try
{
if (datahandler != null)
{
DataSource ds = datahandler.getDataSource();
InputStream is = ds.getInputStream();
String contentType = ds.getContentType();
if (contentType.equals("text/plain"))
{
byte[] bytes = IOUtils.toByteArray(is);
contentObject = new String(bytes);
}
else if (contentType.equals("text/xml") || contentType.equals("application/xml"))
{
contentObject = new StreamSource(is);
}
else if (contentType.startsWith("multipart/"))
{
MimeMultipart mmp = new MimeMultipart(ds);
contentObject = mmp;
}
else if (contentType.equals("image/gif") || contentType.equals("image/jpeg"))
{
contentObject = ImageIOFactory.getImageIO().loadImage(is);
}
else
{
contentObject = is;
}
}
}
catch (SOAPException e)
{
throw e;
}
catch (Exception e)
{
throw new SOAPException("Cannot get content", e);
}
if (contentObject == null)
throw new SOAPException("Content is not available");
return contentObject;
}
public void setContent(Object object, String contentType)
{
try
{
contentObject = object;
if (object instanceof String)
{
InputStream inputStream = new ByteArrayInputStream(((String)contentObject).getBytes());
ManagedMemoryDataSource source = new ManagedMemoryDataSource(inputStream, contentType);
datahandler = new DataHandler(source);
}
else if (object instanceof StreamSource)
{
InputStream inputStream = ((StreamSource)object).getInputStream();
ManagedMemoryDataSource source = new ManagedMemoryDataSource(inputStream, contentType);
datahandler = new DataHandler(source);
}
else if (object instanceof Image)
{
datahandler = new DataHandler(object, contentType);
}
else if (object instanceof MimeMultipart)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
MimeMultipart mmp = (MimeMultipart)object;
mmp.writeTo(baos);
InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
ManagedMemoryDataSource source = new ManagedMemoryDataSource(inputStream, contentType);
datahandler = new DataHandler(source);
}
else if (object instanceof InputStream)
{
InputStream inputStream = ((InputStream)object);
ManagedMemoryDataSource source = new ManagedMemoryDataSource(inputStream, contentType);
datahandler = new DataHandler(source);
}
else
{
throw new IllegalArgumentException("Cannot set content: " + object);
}
}
catch (IllegalArgumentException e)
{
throw e;
}
catch (Exception e)
{
throw new IllegalArgumentException(e.toString());
}
}
public void dispose()
{
contentObject = null;
datahandler = null;
}
public void clearContent()
{
datahandler = null;
contentObject = null;
}
public int getSize() throws SOAPException
{
if (datahandler == null)
{
return 0;
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
try
{
datahandler.writeTo(bout);
}
catch (IOException ex)
{
log.error(Messages.getMessage("javaIOException00"), ex);
throw new SOAPException(Messages.getMessage("javaIOException01", ex.getMessage()), ex);
}
return bout.size();
}
public String[] getMimeHeader(String name)
{
return mimeHeaders.getHeader(name);
}
public String getContentIdRef()
{
return Attachments.CIDprefix + getContentId();
}
}