View Javadoc

    1   /*
    2    *  soapUI, copyright (C) 2004-2007 eviware.com
    3    *
    4    *  soapUI is free software; you can redistribute it and/or modify it under the
    5    *  terms of version 2.1 of the GNU Lesser General Public License as published by
    6    *  the Free Software Foundation.
    7    *
    8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
    9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    10   *  See the GNU Lesser General Public License for more details at gnu.org.
    11   */
    12
    13  package com.eviware.soapui.impl.wsdl.submit.transports.http;
    14
    15  import java.io.BufferedOutputStream;
    16  import java.io.ByteArrayInputStream;
    17  import java.io.File;
    18  import java.io.FileOutputStream;
    19  import java.io.InputStream;
    20  import java.io.OutputStream;
    21  import java.net.MalformedURLException;
    22
    23  import javax.mail.BodyPart;
    24  import javax.mail.MessagingException;
    25
    26  import org.apache.commons.codec.binary.Base64;
    27  import org.apache.commons.codec.binary.Hex;
    28
    29  import com.eviware.soapui.SoapUI;
    30  import com.eviware.soapui.impl.wsdl.WsdlOperation;
    31  import com.eviware.soapui.model.iface.Attachment;
    32  import com.eviware.soapui.support.Tools;
    33
    34  /***
    35   * Attachment for a BodyPart
    36   *
    37   * @author ole.matzura
    38   */
    39
    40  public class BodyPartAttachment implements Attachment
    41  {
    42  	private final BodyPart bodyPart;
    43  	private File tempFile;
    44  	private WsdlOperation operation;
    45  	private final boolean isRequest;
    46  	private byte[] data;
    47
    48  	public BodyPartAttachment(BodyPart bodyPart, WsdlOperation operation, boolean isRequest )
    49  	{
    50  		this.bodyPart = bodyPart;
    51  		this.operation = operation;
    52  		this.isRequest = isRequest;
    53  	}
    54
    55  	public String getContentType()
    56  	{
    57  		try
    58  		{
    59  			return bodyPart.getContentType();
    60  		}
    61  		catch (MessagingException e)
    62  		{
    63  			SoapUI.logError( e );
    64  			return null;
    65  		}
    66  	}
    67
    68  	public AttachmentEncoding getEncoding()
    69  	{
    70  		return AttachmentUtils.getAttachmentEncoding( operation, getPart(), !isRequest );
    71  	}
    72
    73  	public InputStream getInputStream() throws Exception
    74  	{
    75  		if( data != null )
    76  			return new ByteArrayInputStream( data );
    77
    78  		AttachmentEncoding encoding = getEncoding();
    79  		if( encoding == AttachmentEncoding.NONE )
    80  			return bodyPart.getInputStream();
    81
    82  		data = Tools.readAll( bodyPart.getInputStream(), Tools.READ_ALL ).toByteArray();
    83
    84  		if( encoding == AttachmentEncoding.BASE64 )
    85  		{
    86  			if( Base64.isArrayByteBase64( data ))
    87  				data = Tools.readAll( new ByteArrayInputStream( Base64.decodeBase64( data )), Tools.READ_ALL ).toByteArray();
    88  			else
    89  				throw new Exception( "Attachment content for part [" + getPart() + "] is not base64 encoded");
    90  		}
    91  		else if(encoding == AttachmentEncoding.HEX )
    92  		{
    93  			data = Hex.decodeHex( new String( data ).toCharArray() );
    94  		}
    95
    96  		return new ByteArrayInputStream( data );
    97  	}
    98
    99  	public String getName()
    100 	{
    101 		try
    102 		{
    103 			String[] header = bodyPart.getHeader( "Content-Id" );
    104 			if( header == null || header.length == 0 )
    105 				return "<missing name>";
    106
    107 			if( header[0].startsWith( "<" ) && header[0].endsWith( ">" ))
    108 				header[0] = header[0].substring( 1, header[0].length()-1 );
    109
    110 			return header[0];
    111 		}
    112 		catch (MessagingException e)
    113 		{
    114 			SoapUI.logError( e );
    115 			return null;
    116 		}
    117 	}
    118
    119 	public String getPart()
    120 	{
    121 		String name = getName();
    122 		int ix = name.indexOf( '=' );
    123 		if( ix > 0)
    124 		{
    125 			name = name.substring( 0,ix );
    126 		}
    127
    128 		return name;
    129 	}
    130
    131 	public long getSize()
    132 	{
    133 		try
    134 		{
    135 			getInputStream();
    136 			return data == null ? bodyPart.getSize() : data.length;
    137 		}
    138 		catch (Exception e)
    139 		{
    140 			SoapUI.logError( e );
    141 			return -1;
    142 		}
    143 	}
    144
    145 	public String getUrl()
    146 	{
    147 		if( tempFile == null )
    148 		{
    149 			String contentType = getContentType();
    150 			int ix = contentType.lastIndexOf( '/' );
    151 			int iy = -1;
    152 			if (ix != -1)
    153 			iy = contentType.indexOf(';', ix);
    154
    155 			try
    156 			{
    157 				tempFile = File.createTempFile( "response-attachment", (ix == -1 ? ".dat" : "." + (iy == -1 ?
    158 					contentType.substring(ix+1) : contentType.substring(ix+1, iy))));
    159
    160 				OutputStream out = new BufferedOutputStream( new FileOutputStream( tempFile ));
    161 				InputStream inputStream = getInputStream();
    162 				out.write( Tools.readAll( inputStream, 0 ).toByteArray() );
    163 				out.flush();
    164 				out.close();
    165
    166 				inputStream.reset();
    167 			}
    168 			catch (Exception e)
    169 			{
    170 				SoapUI.logError( e );
    171 			}
    172 		}
    173
    174 		try
    175 		{
    176 			return tempFile.toURL().toString();
    177 		}
    178 		catch (MalformedURLException e)
    179 		{
    180 			SoapUI.logError( e );
    181 			return null;
    182 		}
    183 	}
    184
    185 	public void setContentType(String contentType)
    186 	{
    187 	}
    188
    189 	public void setPart(String part)
    190 	{
    191 	}
    192
    193 	public boolean isCached()
    194 	{
    195 		return true;
    196 	}
    197
    198 	public AttachmentType getAttachmentType()
    199 	{
    200 		return AttachmentType.UNKNOWN;
    201 	}
    202
    203 	public void release()
    204 	{
    205 		operation = null;
    206 	}
    207
    208 	public String getContentID()
    209 	{
    210 		try
    211 		{
    212 			String[] header = bodyPart.getHeader( "Content-ID" );
    213 			if( header != null && header.length > 0 )
    214 				return header[0];
    215 		}
    216 		catch( MessagingException e )
    217 		{
    218 			SoapUI.logError( e );
    219 		}
    220
    221 		return null;
    222 	}
    223
    224 	public void setOperation( WsdlOperation operation )
    225 	{
    226 		this.operation = operation;
    227 	}
    228 }