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.filters;
    14
    15  import org.apache.log4j.Logger;
    16  import org.apache.xmlbeans.XmlCursor;
    17  import org.apache.xmlbeans.XmlObject;
    18  import org.w3c.dom.Element;
    19  import org.w3c.dom.NamedNodeMap;
    20  import org.w3c.dom.Node;
    21
    22  import com.eviware.soapui.SoapUI;
    23  import com.eviware.soapui.impl.wsdl.WsdlRequest;
    24  import com.eviware.soapui.impl.wsdl.submit.RequestFilter;
    25  import com.eviware.soapui.impl.wsdl.submit.transports.http.BaseHttpRequestTransport;
    26  import com.eviware.soapui.model.iface.SubmitContext;
    27  import com.eviware.soapui.support.xml.XmlUtils;
    28
    29  /***
    30   * RequestFilter for removing empty elements/attributes
    31   *
    32   * @author Ole.Matzura
    33   */
    34
    35  public class RemoveEmptyContentRequestFilter implements RequestFilter
    36  {
    37  	@SuppressWarnings("unused")
    38  	private final static Logger log = Logger.getLogger(PropertyExpansionRequestFilter.class);
    39
    40  	public void filterRequest(SubmitContext context, WsdlRequest wsdlRequest)
    41  	{
    42  		if( wsdlRequest != null && !wsdlRequest.isRemoveEmptyContent())
    43  			return;
    44
    45  		String content = (String) context.getProperty( BaseHttpRequestTransport.REQUEST_CONTENT );
    46  		content = removeEmptyContent( content );
    47  		if( content != null )
    48  			context.setProperty( BaseHttpRequestTransport.REQUEST_CONTENT, content );
    49  	}
    50
    51  	public static String removeEmptyContent( String content )
    52  	{
    53  		XmlCursor cursor = null;
    54
    55  		try
    56  		{
    57  			XmlObject xmlObject = XmlObject.Factory.parse( content );
    58  			cursor = xmlObject.newCursor();
    59
    60  			cursor.toNextToken();
    61
    62  			// skip root element
    63  			cursor.toNextToken();
    64  			boolean removed = false;
    65
    66  			while( !cursor.isEnddoc() )
    67  			{
    68  				if( cursor.isContainer() )
    69  				{
    70  					Element elm = ( Element ) cursor.getDomNode();
    71  					NamedNodeMap attributes = elm.getAttributes();
    72  					if( attributes != null && attributes.getLength() > 0 )
    73  					{
    74  					   for( int c = 0; c < attributes.getLength(); c++ )
    75  					   {
    76  					   	Node node = attributes.item( c );
    77  					   	if( node.getNodeValue() == null || node.getNodeValue().trim().length() == 0 )
    78  					   	{
    79  					   		cursor.removeAttribute( XmlUtils.getQName( node ) );
    80  					   		removed = true;
    81  					   	}
    82  					   }
    83  					}
    84
    85  					if( cursor.getTextValue() == null || cursor.getTextValue().trim().length() == 0 &&
    86  								XmlUtils.getFirstChildElement( elm ) == null )
    87  					{
    88  						if( cursor.removeXml())
    89  						{
    90  							removed = true;
    91  						}
    92  					}
    93  				}
    94
    95  				cursor.toNextToken();
    96  			}
    97
    98  			if( removed )
    99  			{
    100 				return xmlObject.xmlText();
    101 			}
    102 		}
    103 		catch( Exception e )
    104 		{
    105 			SoapUI.logError( e );
    106 		}
    107 		finally
    108 		{
    109 			if( cursor != null )
    110 				cursor.dispose();
    111 		}
    112
    113 		return null;
    114 	}
    115 }