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;
    14
    15  import java.beans.PropertyChangeEvent;
    16  import java.beans.PropertyChangeListener;
    17  import java.io.File;
    18  import java.io.IOException;
    19  import java.util.ArrayList;
    20  import java.util.Arrays;
    21  import java.util.HashSet;
    22  import java.util.List;
    23  import java.util.Set;
    24
    25  import javax.swing.ImageIcon;
    26
    27  import org.apache.log4j.Logger;
    28
    29  import com.eviware.soapui.SoapUI;
    30  import com.eviware.soapui.config.AttachmentConfig;
    31  import com.eviware.soapui.config.CallConfig;
    32  import com.eviware.soapui.config.CredentialsConfig;
    33  import com.eviware.soapui.impl.wsdl.submit.RequestTransportRegistry;
    34  import com.eviware.soapui.impl.wsdl.submit.filters.PropertyExpansionRequestFilter;
    35  import com.eviware.soapui.impl.wsdl.submit.transports.http.AttachmentUtils;
    36  import com.eviware.soapui.impl.wsdl.submit.transports.http.WsdlResponse;
    37  import com.eviware.soapui.impl.wsdl.support.CompressedStringSupport;
    38  import com.eviware.soapui.impl.wsdl.support.FileAttachment;
    39  import com.eviware.soapui.impl.wsdl.support.ModelItemIconAnimator;
    40  import com.eviware.soapui.impl.wsdl.support.RequestFileAttachment;
    41  import com.eviware.soapui.model.iface.Attachment;
    42  import com.eviware.soapui.model.iface.Interface;
    43  import com.eviware.soapui.model.iface.MessagePart;
    44  import com.eviware.soapui.model.iface.Request;
    45  import com.eviware.soapui.model.iface.Submit;
    46  import com.eviware.soapui.model.iface.SubmitContext;
    47  import com.eviware.soapui.model.iface.SubmitListener;
    48  import com.eviware.soapui.model.support.InterfaceListenerAdapter;
    49  import com.eviware.soapui.settings.WsdlSettings;
    50  import com.eviware.soapui.support.UISupport;
    51  import com.eviware.soapui.support.types.StringToStringMap;
    52
    53  /***
    54   * Request implementation holding a SOAP request
    55   *
    56   * @author Ole.Matzura
    57   */
    58
    59  public class WsdlRequest extends AbstractWsdlModelItem<CallConfig> implements Request, AttachmentContainer
    60  {
    61  	public final static Logger log = Logger.getLogger( WsdlRequest.class );
    62
    63  	public static final String RESPONSE_PROPERTY = WsdlRequest.class.getName() + "@response";
    64  	public static final String RESPONSE_CONTENT_PROPERTY = WsdlRequest.class.getName() + "@response-content";
    65  	public static final String ATTACHMENTS_PROPERTY = WsdlRequest.class.getName() + "@attachments";
    66  	public static final String INLINE_RESPONSE_ATTACHMENTS = WsdlRequest.class.getName() + "@inline-response-attachments";
    67  	public static final String EXPAND_MTOM_RESPONSE_ATTACHMENTS = WsdlRequest.class.getName() + "@expand-mtom-attachments";
    68  	public static final String STRIP_WHITESPACES = WsdlRequest.class.getName() + "@strip-whitespaces";
    69  	public static final String REMOVE_EMPTY_CONTENT = WsdlRequest.class.getName() + "@remove_empty_content";
    70  	public static final String REQUEST_HEADERS_PROPERTY = WsdlRequest.class.getName() + "@request-headers";
    71  	public static final String ENCODE_ATTACHMENTS = WsdlRequest.class.getName() + "@encode_attachments";
    72  	public static final String DISABLE_MULTIPART_ATTACHMENTS = WsdlRequest.class.getName() + "@disable-multipart-attachments";
    73  	public static final String WSS_TIMETOLIVE = WsdlRequest.class.getName() + "@wss-time-to-live";
    74  	public static final String BIND_ADDRESS = WsdlRequest.class.getName() + "@bind_address";
    75  	public static final String OPERATION_PROPERTY = WsdlRequest.class.getName() + "@operation";
    76
    77  	public final static String PW_TYPE_NONE="None";
    78     public final static String PW_TYPE_DIGEST="PasswordDigest";
    79     public final static String PW_TYPE_TEXT="PasswordText";
    80
    81     private WsdlOperation operation;
    82     private WsdlResponse response;
    83     protected List<FileAttachment> attachments = new ArrayList<FileAttachment>();
    84
    85  	private RequestIconAnimator iconAnimator;
    86     private Set<SubmitListener> listeners = new HashSet<SubmitListener>();
    87  	private List<WsdlAttachmentPart> definedAttachmentParts;
    88  	private InternalInterfaceListener interfaceListener = new InternalInterfaceListener();
    89  	private String requestContent;
    90
    91     public WsdlRequest( WsdlOperation operation, CallConfig callConfig )
    92     {
    93     	this( operation, callConfig, false );
    94     }
    95
    96     public WsdlRequest( WsdlOperation operation, CallConfig callConfig, boolean forLoadTest )
    97     {
    98     	super( callConfig, operation, null );
    99
    100       this.operation = operation;
    101
    102       initEndpoints();
    103       initAttachments();
    104
    105       // ensure encoding
    106       if( callConfig.getEncoding() == null || callConfig.getEncoding().length() == 0 )
    107       {
    108       	callConfig.setEncoding( "UTF-8" );
    109       }
    110
    111       if( !forLoadTest )
    112       {
    113 	      iconAnimator = initIconAnimator();
    114 	     	addSubmitListener( iconAnimator );
    115
    116 	      operation.getInterface().addPropertyChangeListener( interfaceListener );
    117 	      operation.getInterface().addInterfaceListener( interfaceListener );
    118       }
    119    }
    120
    121    private void initAttachments()
    122 	{
    123 		for( AttachmentConfig ac : getConfig().getAttachmentList() )
    124 		{
    125 			FileAttachment attachment = new RequestFileAttachment( ac, this );
    126 			attachments.add( attachment);
    127 		}
    128 	}
    129
    130 	public void updateConfig(CallConfig request)
    131 	{
    132 		setConfig( request );
    133 	}
    134
    135    public ModelItemIconAnimator getIconAnimator()
    136    {
    137    	return iconAnimator;
    138    }
    139
    140    protected RequestIconAnimator initIconAnimator()
    141    {
    142    	return new RequestIconAnimator();
    143    }
    144
    145    protected void initEndpoints()
    146    {
    147    	if( getEndpoint() == null )
    148    	{
    149 	      String[] endpoints = operation.getInterface().getEndpoints();
    150 	      if( endpoints.length > 0 )
    151 	      {
    152 	         setEndpoint( endpoints[0] );
    153 	      }
    154    	}
    155    }
    156
    157    public String getRequestContent()
    158    {
    159    	if( getConfig().getRequest() == null )
    160    		getConfig().addNewRequest();
    161
    162    	if( requestContent == null )
    163    		requestContent = CompressedStringSupport.getString( getConfig().getRequest() );
    164
    165    	return requestContent;
    166    }
    167
    168    public void setEndpoint(String endpoint)
    169    {
    170       String old = getEndpoint();
    171       if( old != null && old.equals( endpoint ))
    172       	return;
    173
    174       getConfig().setEndpoint( endpoint );
    175       notifyPropertyChanged( ENDPOINT_PROPERTY, old, endpoint);
    176    }
    177
    178    public String getEndpoint()
    179    {
    180       return getConfig().getEndpoint();
    181    }
    182
    183    public String getEncoding()
    184    {
    185       return getConfig().getEncoding();
    186    }
    187
    188    public void setEncoding(String encoding)
    189    {
    190       String old = getEncoding();
    191       getConfig().setEncoding( encoding );
    192       notifyPropertyChanged( ENCODING_PROPERTY, old, encoding );
    193    }
    194
    195    public StringToStringMap getRequestHeaders()
    196    {
    197    	return StringToStringMap.fromXml( getSettings().getString( REQUEST_HEADERS_PROPERTY, null ));
    198    }
    199
    200    public void setRequestHeaders( StringToStringMap map )
    201    {
    202    	StringToStringMap old = getRequestHeaders();
    203    	getSettings().setString( REQUEST_HEADERS_PROPERTY, map.toXml() );
    204    	notifyPropertyChanged( REQUEST_HEADERS_PROPERTY, old, map );
    205    }
    206
    207    public boolean isInlineResponseAttachments()
    208    {
    209    	return getSettings().getBoolean( INLINE_RESPONSE_ATTACHMENTS );
    210    }
    211
    212    public void setInlineResponseAttachments( boolean inlineResponseAttachments )
    213    {
    214    	boolean old = getSettings().getBoolean( INLINE_RESPONSE_ATTACHMENTS );
    215    	getSettings().setBoolean( INLINE_RESPONSE_ATTACHMENTS, inlineResponseAttachments );
    216    	notifyPropertyChanged( INLINE_RESPONSE_ATTACHMENTS, old, inlineResponseAttachments );
    217    }
    218
    219    public boolean isStripWhitespaces()
    220    {
    221    	return getSettings().getBoolean( STRIP_WHITESPACES );
    222    }
    223
    224    public void setStripWhitespaces( boolean stripWhitespaces )
    225    {
    226    	boolean old = getSettings().getBoolean( STRIP_WHITESPACES );
    227    	getSettings().setBoolean( STRIP_WHITESPACES, stripWhitespaces );
    228    	notifyPropertyChanged( STRIP_WHITESPACES, old, stripWhitespaces );
    229    }
    230
    231    public boolean isExpandMtomResponseAttachments()
    232    {
    233    	return getSettings().getBoolean( EXPAND_MTOM_RESPONSE_ATTACHMENTS );
    234    }
    235
    236    public void setExpandMtomResponseAttachments( boolean expandMtomResponseAttachments )
    237    {
    238    	boolean old = getSettings().getBoolean( EXPAND_MTOM_RESPONSE_ATTACHMENTS );
    239    	getSettings().setBoolean( EXPAND_MTOM_RESPONSE_ATTACHMENTS, expandMtomResponseAttachments );
    240    	notifyPropertyChanged( EXPAND_MTOM_RESPONSE_ATTACHMENTS, old, expandMtomResponseAttachments );
    241    }
    242
    243    /***
    244     * Use getResponse().getContentAsString();
    245     * @deprecated
    246     */
    247
    248    public String getResponseContent()
    249    {
    250       return response == null ? null : response.getContentAsString();
    251    }
    252
    253    public WsdlResponse getResponse()
    254    {
    255    	return response;
    256    }
    257
    258    public WsdlOperation getOperation()
    259    {
    260       return operation;
    261    }
    262
    263    public void setOperation( WsdlOperation wsdlOperation )
    264 	{
    265    	WsdlOperation oldOperation = operation;
    266 		this.operation = wsdlOperation;
    267
    268 		definedAttachmentParts = null;
    269 		notifyPropertyChanged( OPERATION_PROPERTY, oldOperation, operation );
    270 	}
    271
    272    public void setRequestContent(String request)
    273    {
    274       String old = getRequestContent();
    275       if( request.equals( old ))
    276       	return;
    277
    278       requestContent = request;
    279       definedAttachmentParts = null;
    280       notifyPropertyChanged( REQUEST_PROPERTY, old, request );
    281    }
    282
    283    public void setResponse( WsdlResponse response, SubmitContext context )
    284    {
    285    	WsdlResponse oldResponse = (WsdlResponse) getResponse();
    286 		this.response = response;
    287
    288       notifyPropertyChanged( RESPONSE_PROPERTY, oldResponse, response );
    289    }
    290
    291    public ImageIcon getIcon()
    292    {
    293    	return iconAnimator.getIcon();
    294    }
    295
    296    public String getUsername()
    297    {
    298    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    299    	if( credentialsConfig == null ) return null;
    300
    301    	return credentialsConfig.getUsername();
    302    }
    303
    304    public String getPassword()
    305    {
    306    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    307    	if( credentialsConfig == null ) return null;
    308
    309    	return credentialsConfig.getPassword();
    310    }
    311
    312    public String getDomain()
    313    {
    314    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    315    	if( credentialsConfig == null ) return null;
    316
    317    	return credentialsConfig.getDomain();
    318    }
    319
    320    public void setUsername( String username )
    321    {
    322    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    323    	if( credentialsConfig == null )
    324    		credentialsConfig = getConfig().addNewCredentials();
    325
    326    	credentialsConfig.setUsername( username );
    327    }
    328
    329    public void setPassword( String password )
    330    {
    331    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    332    	if( credentialsConfig == null )
    333    		credentialsConfig = getConfig().addNewCredentials();
    334
    335    	credentialsConfig.setPassword( password );
    336    }
    337
    338    public void setDomain( String domain )
    339    {
    340    	CredentialsConfig credentialsConfig = getConfig().getCredentials();
    341    	if( credentialsConfig == null )
    342    		credentialsConfig = getConfig().addNewCredentials();
    343
    344    	credentialsConfig.setDomain( domain );
    345    }
    346
    347    public void addSubmitListener(SubmitListener listener)
    348 	{
    349 		listeners.add( listener );
    350 	}
    351
    352 	public void removeSubmitListener(SubmitListener listener)
    353 	{
    354 		listeners.remove( listener );
    355 	}
    356
    357 	public WsdlSubmit submit( SubmitContext submitContext, boolean async ) throws SubmitException
    358 	{
    359       String endpoint = PropertyExpansionRequestFilter.expandProperties( submitContext, getEndpoint());
    360 		if( endpoint == null || endpoint.trim().length() == 0 )
    361       {
    362       	UISupport.showErrorMessage( "Missing endpoint for request [" + getName() + "]" );
    363       	return null;
    364       }
    365
    366 		try
    367 		{
    368 			WsdlSubmit submitter = new WsdlSubmit(this, (SubmitListener[]) listeners.toArray(new SubmitListener[listeners
    369 					.size()]), RequestTransportRegistry.getTransport(endpoint, submitContext));
    370 			submitter.submitRequest(submitContext, async);
    371 			return submitter;
    372 		}
    373 		catch( Exception e )
    374 		{
    375 			throw new SubmitException( e.toString() );
    376 		}
    377 	}
    378
    379 	private class InternalInterfaceListener extends InterfaceListenerAdapter implements PropertyChangeListener
    380 	{
    381 		public void propertyChange(PropertyChangeEvent evt)
    382 		{
    383 			if( evt.getPropertyName().equals( Interface.ENDPOINT_PROPERTY ))
    384 			{
    385 				String endpoint = getEndpoint();
    386 				if( evt.getOldValue() != null && evt.getOldValue().equals( endpoint ))
    387 				{
    388 					setEndpoint( (String) evt.getNewValue() );
    389 				}
    390 			}
    391 		}
    392 	}
    393
    394 	public String getWssPasswordType()
    395 	{
    396 		return getConfig().getWssPasswordType();
    397 	}
    398
    399 	public void setWssPasswordType(String wssPasswordType)
    400 	{
    401 		getConfig().setWssPasswordType( wssPasswordType );
    402 	}
    403
    404 	/* (non-Javadoc)
    405 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#attachFile(java.io.File, boolean)
    406 	 */
    407 	public Attachment attachFile( File file, boolean cache )
    408 	{
    409 		try
    410 		{
    411 			FileAttachment fileAttachment = new RequestFileAttachment( file, cache, this );
    412 			attachments.add( fileAttachment );
    413 			notifyPropertyChanged(ATTACHMENTS_PROPERTY, null, fileAttachment );
    414 			return fileAttachment;
    415 		}
    416 		catch (IOException e)
    417 		{
    418 			UISupport.showErrorMessage( e );
    419 			return null;
    420 		}
    421 	}
    422
    423 	/* (non-Javadoc)
    424 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachmentCount()
    425 	 */
    426 	public int getAttachmentCount()
    427 	{
    428 		return attachments.size();
    429 	}
    430
    431 	/* (non-Javadoc)
    432 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachmentAt(int)
    433 	 */
    434 	public Attachment getAttachmentAt( int index )
    435 	{
    436 		return attachments.get( index );
    437 	}
    438
    439 	/* (non-Javadoc)
    440 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachmentsForPart(java.lang.String)
    441 	 */
    442 	public Attachment [] getAttachmentsForPart( String partName )
    443 	{
    444 		List<Attachment> result = new ArrayList<Attachment>();
    445
    446 		for( Attachment attachment : attachments )
    447 		{
    448 			if( attachment.getPart().equals( partName ))
    449 				result.add( attachment );
    450 		}
    451
    452 		return result.toArray( new Attachment[result.size()]);
    453 	}
    454
    455 	/* (non-Javadoc)
    456 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#removeAttachment(com.eviware.soapui.model.iface.Attachment)
    457 	 */
    458 	public void removeAttachment( Attachment attachment )
    459 	{
    460 		int ix = attachments.indexOf( attachment );
    461 		attachments.remove( ix );
    462
    463 		try
    464 		{
    465 			notifyPropertyChanged(ATTACHMENTS_PROPERTY, attachment, null );
    466 		}
    467 		finally
    468 		{
    469 			getConfig().removeAttachment( ix);
    470 		}
    471 	}
    472
    473 	/* (non-Javadoc)
    474 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachments()
    475 	 */
    476 	public Attachment[] getAttachments()
    477 	{
    478 		return attachments.toArray( new Attachment[attachments.size()] );
    479 	}
    480
    481 	/* (non-Javadoc)
    482 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getDefinedAttachmentParts()
    483 	 */
    484 	public WsdlAttachmentPart [] getDefinedAttachmentParts()
    485 	{
    486 		if( definedAttachmentParts == null )
    487 		{
    488 			try
    489 			{
    490 				UISupport.setHourglassCursor();
    491 				definedAttachmentParts = AttachmentUtils.extractAttachmentParts(
    492 							operation, getRequestContent(), true, false );
    493 			}
    494 			catch (Exception e)
    495 			{
    496 				log.warn( e.toString() );
    497 				definedAttachmentParts = new ArrayList<WsdlAttachmentPart>();
    498 			}
    499 			finally
    500 			{
    501 				UISupport.resetCursor();
    502 			}
    503 		}
    504
    505 		return definedAttachmentParts.toArray( new WsdlAttachmentPart[definedAttachmentParts.size()] );
    506 	}
    507
    508 	/* (non-Javadoc)
    509 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachmentPart(java.lang.String)
    510 	 */
    511 	public WsdlAttachmentPart getAttachmentPart( String partName )
    512 	{
    513 		WsdlAttachmentPart[] parts = getDefinedAttachmentParts();
    514 		for( WsdlAttachmentPart part : parts )
    515 		{
    516 			if( part.getName().equals( partName ))
    517 				return part;
    518 		}
    519
    520 		return null;
    521 	}
    522
    523 	public void copyAttachmentsTo(WsdlRequest newRequest)
    524 	{
    525 		if( getAttachmentCount() > 0 )
    526       {
    527 			try
    528 			{
    529 				UISupport.setHourglassCursor();
    530 				for (int c = 0; c < getAttachmentCount(); c++)
    531 				{
    532 					try
    533 					{
    534 						Attachment attachment = getAttachmentAt(c);
    535 						newRequest.addAttachment( attachment );
    536 					}
    537 					catch (Exception e)
    538 					{
    539 						SoapUI.logError( e );
    540 					}
    541 				}
    542 			}
    543 			finally
    544 			{
    545 				UISupport.resetCursor();
    546 			}
    547       }
    548 	}
    549
    550 	private Attachment addAttachment(Attachment attachment)
    551 	{
    552 		if( attachment instanceof FileAttachment )
    553 		{
    554 			AttachmentConfig oldConfig = ((FileAttachment)attachment).getConfig();
    555 			AttachmentConfig newConfig = (AttachmentConfig) getConfig().addNewAttachment().set( oldConfig );
    556 			FileAttachment newAttachment = new RequestFileAttachment( newConfig, this );
    557 			attachments.add( newAttachment);
    558 			return newAttachment;
    559 		}
    560 		else log.error( "Unkown attachment type: " + attachment );
    561
    562 		return null;
    563 	}
    564
    565 	public void copyTo(WsdlRequest newRequest, boolean copyAttachments, boolean copyHeaders)
    566 	{
    567       newRequest.setEncoding( getEncoding() );
    568       newRequest.setEndpoint( getEndpoint() );
    569       newRequest.setRequestContent( getRequestContent() );
    570       newRequest.setWssPasswordType( getWssPasswordType() );
    571
    572       CredentialsConfig credentials = getConfig().getCredentials();
    573       if( credentials != null)
    574       	newRequest.getConfig().setCredentials( (CredentialsConfig) credentials.copy() );
    575
    576       if( copyAttachments )
    577       	copyAttachmentsTo( newRequest );
    578
    579       if( copyHeaders )
    580       	newRequest.setRequestHeaders( getRequestHeaders() );
    581 	}
    582
    583 	/* (non-Javadoc)
    584 	 * @see com.eviware.soapui.impl.wsdl.AttachmentContainer#isMtomEnabled()
    585 	 */
    586 	public boolean isMtomEnabled()
    587 	{
    588 		return getSettings().getBoolean( WsdlSettings.ENABLE_MTOM );
    589 	}
    590
    591 	public void setMtomEnabled( boolean mtomEnabled )
    592 	{
    593 		getSettings().setBoolean( WsdlSettings.ENABLE_MTOM, mtomEnabled );
    594 		definedAttachmentParts = null;
    595 	}
    596
    597 	public void release()
    598 	{
    599 		super.release();
    600
    601 		getOperation().getInterface().removeInterfaceListener( interfaceListener );
    602 		getOperation().getInterface().removePropertyChangeListener( interfaceListener );
    603 	}
    604
    605 	public MessagePart[] getRequestParts()
    606 	{
    607 		try
    608 		{
    609 			List<MessagePart> result = new ArrayList<MessagePart>();
    610 			result.addAll( Arrays.asList( getOperation().getDefaultRequestParts() ));
    611 			result.addAll( Arrays.asList( getDefinedAttachmentParts()) );
    612
    613 			return result.toArray( new MessagePart[result.size()] );
    614 		}
    615 		catch (Exception e)
    616 		{
    617 			SoapUI.logError( e );
    618 			return new MessagePart [0];
    619 		}
    620 	}
    621
    622 	public MessagePart[] getResponseParts()
    623 	{
    624 		try
    625 		{
    626 			List<MessagePart> result = new ArrayList<MessagePart>();
    627 			result.addAll( Arrays.asList( getOperation().getDefaultResponseParts() ));
    628
    629 			if( getResponse() != null )
    630 				result.addAll( AttachmentUtils.extractAttachmentParts(
    631 						(WsdlOperation)getOperation(), getResponse().getContentAsString(), true, true ));
    632
    633 			return result.toArray( new MessagePart[result.size()] );
    634 		}
    635 		catch (Exception e)
    636 		{
    637 			SoapUI.logError( e );
    638 			return new MessagePart [0];
    639 		}
    640 	}
    641
    642 	protected class RequestIconAnimator extends ModelItemIconAnimator implements SubmitListener
    643 	{
    644 		public RequestIconAnimator()
    645 		{
    646 			super( WsdlRequest.this, "/request.gif",
    647 						new String[] {"/exec_request_1.gif", "/exec_request_2.gif",
    648 						"/exec_request_3.gif", "/exec_request_4.gif"} );
    649 		}
    650
    651 		public boolean beforeSubmit(Submit submit, SubmitContext context)
    652 		{
    653 			if( isEnabled() && submit.getRequest() == getTarget() )
    654 				start();
    655 	      return true;
    656 		}
    657
    658 		public void afterSubmit(Submit submit, SubmitContext context)
    659 		{
    660 			if( submit.getRequest() == getTarget() )
    661 				stop();
    662 		}
    663 	}
    664
    665 	public boolean isMultipartEnabled()
    666 	{
    667 		return !getSettings().getBoolean( DISABLE_MULTIPART_ATTACHMENTS );
    668 	}
    669
    670 	public void setMultipartEnabled( boolean multipartEnabled )
    671 	{
    672 		getSettings().setBoolean( DISABLE_MULTIPART_ATTACHMENTS, !multipartEnabled );
    673 	}
    674
    675 	public String getWssTimeToLive()
    676 	{
    677 		return getSettings().getString( WSS_TIMETOLIVE, null );
    678 	}
    679
    680 	public void setWssTimeToLive( String ttl )
    681 	{
    682 		getSettings().setString( WSS_TIMETOLIVE, ttl );
    683 	}
    684
    685 	@Override
    686 	public void onSave()
    687 	{
    688 		if( requestContent != null )
    689 		{
    690 			CompressedStringSupport.setString( getConfig().getRequest(), requestContent );
    691 			requestContent = null;
    692 		}
    693 	}
    694
    695 	public long getContentLength()
    696 	{
    697 		return getRequestContent().length();
    698 	}
    699
    700 	public boolean isRemoveEmptyContent()
    701 	{
    702 		return getSettings().getBoolean( REMOVE_EMPTY_CONTENT );
    703 	}
    704
    705 	public void setRemoveEmptyContent( boolean removeEmptyContent )
    706    {
    707    	boolean old = getSettings().getBoolean( REMOVE_EMPTY_CONTENT );
    708    	getSettings().setBoolean( REMOVE_EMPTY_CONTENT, removeEmptyContent );
    709    	notifyPropertyChanged( REMOVE_EMPTY_CONTENT, old, removeEmptyContent );
    710    }
    711
    712 	public boolean isEncodeAttachments()
    713 	{
    714 		return getSettings().getBoolean( ENCODE_ATTACHMENTS );
    715 	}
    716
    717 	public void setEncodeAttachments( boolean encodeAttachments )
    718    {
    719    	boolean old = getSettings().getBoolean( ENCODE_ATTACHMENTS );
    720    	getSettings().setBoolean( ENCODE_ATTACHMENTS, encodeAttachments );
    721    	notifyPropertyChanged( ENCODE_ATTACHMENTS, old, encodeAttachments );
    722    }
    723
    724 	public String getBindAddress()
    725 	{
    726 		return getSettings().getString( BIND_ADDRESS, "" );
    727 	}
    728
    729 	public void setBindAddress( String bindAddress )
    730    {
    731    	String old = getSettings().getString( BIND_ADDRESS, "" );
    732    	getSettings().setString( BIND_ADDRESS, bindAddress );
    733    	notifyPropertyChanged( BIND_ADDRESS, old, bindAddress );
    734    }
    735 }