View Javadoc

1   /*
2    *  soapUI, copyright (C) 2006 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
6    *  either version 2.1 of the License, or (at your option) any later version.
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.teststeps.assertions;
14  
15  import org.apache.xmlbeans.XmlObject;
16  
17  import com.eviware.soapui.config.RequestAssertionConfig;
18  import com.eviware.soapui.impl.wsdl.WsdlInterface;
19  import com.eviware.soapui.impl.wsdl.WsdlOperation;
20  import com.eviware.soapui.impl.wsdl.panels.support.assertions.Assertable;
21  import com.eviware.soapui.impl.wsdl.submit.WsdlMessageExchange;
22  import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlContext;
23  import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlValidator;
24  import com.eviware.soapui.impl.wsdl.teststeps.WsdlMessageAssertion;
25  import com.eviware.soapui.model.iface.SubmitContext;
26  import com.eviware.soapui.support.UISupport;
27  import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder;
28  import com.eviware.soapui.support.xml.XmlObjectConfigurationReader;
29  
30  /***
31   * Asserts that a request or response message complies with its related 
32   * WSDL definition / XML Schema
33   * 
34   * @author Ole.Matzura
35   */
36  
37  public class SchemaComplianceAssertion extends WsdlMessageAssertion implements RequestAssertion, ResponseAssertion
38  {
39  	public static final String ID = "Schema Compliance";
40  	private String definition;
41  	
42     public SchemaComplianceAssertion(RequestAssertionConfig assertionConfig, Assertable assertable)
43     {
44        super(assertionConfig, assertable);
45        
46        XmlObjectConfigurationReader reader = new XmlObjectConfigurationReader( getConfiguration() );
47        definition = reader.readString( "definition", null );
48     }
49     
50  	protected String internalAssertResponse(WsdlMessageExchange messageExchange, SubmitContext context) throws AssertionException
51  	{
52  		WsdlContext wsdlContext = getWsdlContext( messageExchange );
53  		WsdlValidator validator = new WsdlValidator( wsdlContext );
54  		
55  		try
56  		{
57  			AssertionError[] errors = validator.assertResponse( messageExchange, false );
58  			if (errors.length > 0)
59  				throw new AssertionException(errors);
60  		}
61  		catch( AssertionException e )
62  		{
63  			throw e;
64  		}
65  		catch (Exception e)
66  		{
67  			throw new AssertionException( new AssertionError( e.getMessage() ));
68  		}
69  		
70  		return "Schema compliance OK";
71  	}
72  
73  	private WsdlContext getWsdlContext( WsdlMessageExchange messageExchange )
74  	{
75  		WsdlOperation operation = messageExchange.getOperation();
76  		WsdlContext wsdlContext = null;
77  		if( definition == null || definition.trim().length() == 0 || definition.equals( operation.getInterface().getDefinition() ))
78  		{
79  			wsdlContext = ((WsdlInterface)operation.getInterface()).getWsdlContext();
80  		}
81  		else
82  		{
83  			wsdlContext = new WsdlContext( definition, ((WsdlInterface)operation.getInterface()).getSoapVersion(), null, 
84  					(WsdlInterface) operation.getInterface() );
85  		}
86  		return wsdlContext;
87  	}
88  	
89     public boolean configure()
90     {
91     	String value = definition;
92     	
93     	WsdlInterface iface = getAssertable().getInterface();
94     	String orgDef = iface == null ? null : iface.getDefinition();
95     		
96     	if( value == null || value.trim().length() == 0 )
97     	{
98  			value = orgDef;
99     	}
100    	
101       value = UISupport.prompt( "Specify defintion url to validate by", "Configure SchemaCompliance Assertion", value );
102       
103       if( value == null ) return false;
104       
105       if( value.trim().length() == 0 || value.equals( orgDef ))
106       	definition = "";
107       else
108       	definition = value;
109       
110       setConfiguration( createConfiguration() );
111       return true;
112    }
113 
114    protected XmlObject createConfiguration()
115    {
116    	XmlObjectConfigurationBuilder builder = new XmlObjectConfigurationBuilder();
117    	return builder.add( "definition", definition ).finish();
118    }
119 
120    public boolean isConfigurable()
121    {
122       return true;
123    }
124 
125 	protected String internalAssertRequest( WsdlMessageExchange messageExchange, SubmitContext context ) throws AssertionException
126 	{
127 		WsdlContext wsdlContext = getWsdlContext( messageExchange );
128 		WsdlValidator validator = new WsdlValidator( wsdlContext );
129 		
130 		try
131 		{
132 			AssertionError[] errors = validator.assertRequest( messageExchange, false );
133 			if (errors.length > 0)
134 				throw new AssertionException(errors);
135 		}
136 		catch( AssertionException e )
137 		{
138 			throw e;
139 		}
140 		catch (Exception e)
141 		{
142 			throw new AssertionException( new AssertionError( e.getMessage() ));
143 		}
144 		
145 		return "Schema compliance OK";
146 	}
147 }