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.support;
    14
    15  import java.io.BufferedInputStream;
    16  import java.io.ByteArrayInputStream;
    17  import java.io.ByteArrayOutputStream;
    18  import java.io.File;
    19  import java.io.FileInputStream;
    20  import java.io.FileNotFoundException;
    21  import java.io.FileOutputStream;
    22  import java.io.IOException;
    23  import java.io.InputStream;
    24  import java.util.zip.ZipEntry;
    25  import java.util.zip.ZipInputStream;
    26  import java.util.zip.ZipOutputStream;
    27
    28  import org.apache.commons.codec.binary.Base64;
    29  import org.apache.commons.codec.binary.Hex;
    30  import org.apache.log4j.Logger;
    31
    32  import com.eviware.soapui.SoapUI;
    33  import com.eviware.soapui.config.AttachmentConfig;
    34  import com.eviware.soapui.impl.wsdl.panels.request.components.editor.inspectors.attachments.ContentTypeHandler;
    35  import com.eviware.soapui.support.Tools;
    36
    37  /***
    38   * Attachments cached locally for each request
    39   *
    40   * @author Ole.Matzura
    41   */
    42
    43  public abstract class FileAttachment implements WsdlAttachment
    44  {
    45  	private AttachmentConfig config;
    46  	private final static Logger log = Logger.getLogger(FileAttachment.class);
    47
    48  	public FileAttachment( AttachmentConfig config )
    49  	{
    50  		this.config = config;
    51
    52  		if( config.getTempFilename() != null )
    53  		{
    54  			try
    55  			{
    56  				log.info( "Moving locally cached file [" + config.getTempFilename() + "] to internal cache.." );
    57  				File tempFile = new File( config.getTempFilename() );
    58  				cacheFileLocally( tempFile);
    59  			}
    60  			catch (IOException e)
    61  			{
    62  				if( !config.isSetData() )
    63  				{
    64  					config.setData( new byte[0] );
    65  					config.setSize( 0 );
    66  				}
    67
    68  				SoapUI.logError( e );
    69  			}
    70  		}
    71
    72  		if( isCached() )
    73  		{
    74  			if( config.isSetTempFilename())
    75  				config.unsetTempFilename();
    76
    77  			if( config.isSetUrl() )
    78  				config.unsetUrl();
    79  		}
    80  	}
    81
    82  	public FileAttachment( File file, boolean cache, AttachmentConfig config ) throws IOException
    83  	{
    84  		this( config );
    85
    86  		config.setName( file.getName() );
    87  		config.setContentType( ContentTypeHandler.getContentTypeFromFilename( file.getName() ) );
    88
    89  		// cache locally if specified
    90  		if( cache )
    91  		{
    92  			cacheFileLocally( file );
    93  		}
    94  		else
    95  		{
    96  			config.setUrl( file.getPath() );
    97  		}
    98  	}
    99
    100 	private void cacheFileLocally(File file) throws FileNotFoundException, IOException
    101 	{
    102 		// write attachment-data to tempfile
    103 		ByteArrayOutputStream data = new ByteArrayOutputStream();
    104 		ZipOutputStream out = new ZipOutputStream( data );
    105 		out.putNextEntry( new ZipEntry( config.getName() ));
    106
    107 		InputStream in = new FileInputStream( file );
    108 		long sz = file.length();
    109 		config.setSize( sz );
    110
    111 		Tools.writeAll( out, in );
    112
    113 		in.close();
    114 		out.closeEntry();
    115 		out.finish();
    116 		out.close();
    117 		data.close();
    118
    119 		config.setData( data.toByteArray() );
    120 	}
    121
    122 	public String getContentType()
    123 	{
    124 		return config.getContentType();
    125 	}
    126
    127 	public InputStream getInputStream() throws IOException
    128 	{
    129 		BufferedInputStream inputStream = null;
    130
    131 		if( isCached() )
    132 		{
    133 			ZipInputStream zipInputStream = new ZipInputStream( new ByteArrayInputStream( config.getData() ));
    134 			zipInputStream.getNextEntry();
    135 			inputStream = new BufferedInputStream( zipInputStream );
    136 		}
    137 		else
    138 		{
    139 			inputStream = new BufferedInputStream( new FileInputStream( config.getUrl() ));
    140 		}
    141
    142 		AttachmentEncoding encoding = getEncoding();
    143 		if( encoding == AttachmentEncoding.BASE64 )
    144 		{
    145 			ByteArrayOutputStream data = Tools.readAll( inputStream, Tools.READ_ALL );
    146 			return new ByteArrayInputStream( Base64.encodeBase64( data.toByteArray() ));
    147 		}
    148 		else if( encoding == AttachmentEncoding.HEX )
    149 		{
    150 			ByteArrayOutputStream data = Tools.readAll( inputStream, Tools.READ_ALL );
    151 			return new ByteArrayInputStream( new String( Hex.encodeHex( data.toByteArray() )).getBytes() );
    152 		}
    153
    154 		return inputStream;
    155 	}
    156
    157 	public String getName()
    158 	{
    159 		return config.getName();
    160 	}
    161
    162 	public long getSize()
    163 	{
    164 		if( isCached() )
    165 			return config.getSize();
    166 		else
    167 			return new File( config.getUrl() ).length();
    168 	}
    169
    170 	public void release()
    171 	{
    172 		if( isCached() )
    173 			new File( config.getTempFilename() ).delete();
    174 	}
    175
    176 	public String getPart()
    177 	{
    178 		return config.getPart();
    179 	}
    180
    181 	public void setContentType(String contentType)
    182 	{
    183 		config.setContentType( contentType );
    184 	}
    185
    186 	public void setPart(String part)
    187 	{
    188 		config.setPart( part );
    189 	}
    190
    191 	public String getUrl()
    192 	{
    193 		if( isCached() )
    194 		{
    195 			String name = config.getName();
    196 			int ix = name.lastIndexOf( "." );
    197
    198 			try
    199 			{
    200 				File tempFile = File.createTempFile( "attachment-" + name.substring( 0, ix), name.substring(ix)  );
    201 				FileOutputStream out = new FileOutputStream( tempFile );
    202 				InputStream in = getInputStream();
    203
    204 				Tools.writeAll( out, in );
    205
    206 				out.close();
    207 				in.close();
    208
    209 				return tempFile.getAbsoluteFile().toURL().toString();
    210 			}
    211 			catch (IOException e)
    212 			{
    213 				SoapUI.logError( e );
    214 			}
    215 		}
    216 		else
    217 		{
    218 			return config.getUrl();
    219 		}
    220
    221 		return null;
    222 	}
    223
    224 	public boolean isCached()
    225 	{
    226 		return config.isSetData();
    227 	}
    228
    229 	abstract public AttachmentType getAttachmentType();
    230
    231 	public void updateConfig(AttachmentConfig config)
    232 	{
    233 		this.config = config;
    234 	}
    235
    236 	public AttachmentConfig getConfig()
    237 	{
    238 		return config;
    239 	}
    240
    241 	public void setContentID( String contentID )
    242 	{
    243 		if( (contentID == null || contentID.length() == 0) && config.isSetContentId() )
    244 			config.unsetContentId();
    245 		else
    246 			config.setContentId( contentID );
    247 	}
    248
    249 	public String getContentID()
    250 	{
    251 		return config.getContentId();
    252 	}
    253 }