1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.teststeps.assertions;
14
15 import java.lang.reflect.Constructor;
16 import java.util.ArrayList;
17 import java.util.Arrays;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21
22 import org.apache.log4j.Logger;
23
24 import com.eviware.soapui.SoapUI;
25 import com.eviware.soapui.config.RequestAssertionConfig;
26 import com.eviware.soapui.impl.wsdl.support.assertions.Assertable;
27 import com.eviware.soapui.impl.wsdl.teststeps.WsdlMessageAssertion;
28 import com.eviware.soapui.support.types.StringToStringMap;
29
30 /***
31 * Registry for WsdlAssertions
32 *
33 * @author Ole.Matzura
34 */
35
36 public class WsdlAssertionRegistry
37 {
38 private static WsdlAssertionRegistry instance;
39 private Map<String,Class<? extends WsdlMessageAssertion> > availableAssertions = new HashMap<String,Class<? extends WsdlMessageAssertion> >();
40 private StringToStringMap assertionLabels = new StringToStringMap();
41 private final static Logger log = Logger.getLogger( WsdlAssertionRegistry.class );
42
43 public WsdlAssertionRegistry()
44 {
45 addAssertion( SoapResponseAssertion.ID, "SOAP Response", SoapResponseAssertion.class );
46 addAssertion( SchemaComplianceAssertion.ID, "Schema Compliance", SchemaComplianceAssertion.class );
47 addAssertion( SimpleContainsAssertion.ID, "Contains", SimpleContainsAssertion.class );
48 addAssertion( SimpleNotContainsAssertion.ID, "Not Contains", SimpleNotContainsAssertion.class );
49 addAssertion( XPathContainsAssertion.ID, XPathContainsAssertion.LABEL, XPathContainsAssertion.class );
50 addAssertion( NotSoapFaultAssertion.ID, NotSoapFaultAssertion.LABEL, NotSoapFaultAssertion.class );
51 addAssertion( SoapFaultAssertion.ID, "SOAP Fault", SoapFaultAssertion.class );
52 addAssertion( ResponseSLAAssertion.ID, "Response SLA", ResponseSLAAssertion.class );
53 addAssertion( GroovyScriptAssertion.ID, GroovyScriptAssertion.LABEL, GroovyScriptAssertion.class );
54 addAssertion( XQueryContainsAssertion.ID, XQueryContainsAssertion.LABEL, XQueryContainsAssertion.class );
55 }
56
57 public void addAssertion( String id, String label, Class<? extends WsdlMessageAssertion> assertionClass )
58 {
59 availableAssertions.put( id, assertionClass );
60 assertionLabels.put( label, id );
61 }
62
63 public static synchronized WsdlAssertionRegistry getInstance()
64 {
65 if( instance == null )
66 instance = new WsdlAssertionRegistry();
67
68 return instance;
69 }
70
71 public WsdlMessageAssertion buildAssertion(RequestAssertionConfig config, Assertable request)
72 {
73 try
74 {
75 String type = config.getType();
76 Class<? extends WsdlMessageAssertion> clazz = availableAssertions.get(type);
77 if( clazz == null )
78 {
79 log.error( "Missing assertion for type [" + type + "]" );
80 }
81 else
82 {
83 Constructor<? extends WsdlMessageAssertion> ctor = clazz
84 .getConstructor(new Class[] { RequestAssertionConfig.class,
85 Assertable.class });
86
87 return (WsdlMessageAssertion) ctor.newInstance(config, request);
88 }
89 }
90 catch (Exception e)
91 {
92 SoapUI.logError( e );
93 }
94
95 return null;
96 }
97
98 public boolean canBuildAssertion( RequestAssertionConfig config )
99 {
100 return availableAssertions.get(config.getType()) != null;
101 }
102
103 public enum AssertableType { REQUEST, RESPONSE, BOTH };
104
105 public String getAssertionTypeForName( String name )
106 {
107 return assertionLabels.get( name );
108 }
109
110 public String[] getAvailableAssertionNames( AssertableType type )
111 {
112 List<String> result = new ArrayList<String>();
113
114 for( String assertion : assertionLabels.keySet() )
115 {
116 switch( type )
117 {
118 case BOTH :
119 {
120 result.add( assertion );
121 break;
122 }
123 case REQUEST :
124 {
125 String assertionId = assertionLabels.get( assertion );
126 if( Arrays.asList( availableAssertions.get( assertionId ).getInterfaces() ).contains( RequestAssertion.class ))
127 {
128 result.add( assertion );
129 }
130 break;
131 }
132
133 case RESPONSE :
134 {
135 String assertionId = assertionLabels.get( assertion );
136 if( Arrays.asList( availableAssertions.get( assertionId ).getInterfaces() ).contains( ResponseAssertion.class ))
137 {
138 result.add( assertion );
139 }
140 break;
141 }
142 }
143 }
144
145 return result.toArray( new String[result.size()] );
146 }
147
148 public String getAssertionNameForType( String type )
149 {
150 for( String assertion : assertionLabels.keySet() )
151 {
152 if( assertionLabels.get( assertion ).equals( type ))
153 return assertion;
154 }
155
156 return null;
157 }
158
159 public boolean canAddMultipleAssertions( String name, Assertable assertable )
160 {
161 for( int c = 0; c < assertable.getAssertionCount(); c++ )
162 {
163 WsdlMessageAssertion assertion = assertable.getAssertionAt( c );
164 if( assertion.isAllowMultiple() )
165 continue;
166
167 if( assertion.getClass().equals( availableAssertions.get( getAssertionTypeForName( name ))))
168 {
169 return false;
170 }
171 }
172
173 return true;
174 }
175
176 public boolean canAddAssertion( WsdlMessageAssertion assertion, Assertable assertable )
177 {
178 if( assertion.isAllowMultiple())
179 return true;
180
181 for( int c = 0; c < assertable.getAssertionCount(); c++ )
182 {
183 if( assertion.getClass().equals( assertable.getAssertionAt( c ).getClass()))
184 {
185 return false;
186 }
187 }
188
189 return true;
190 }
191 }