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