View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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  package com.eviware.soapui.impl.rest.support;
13  
14  import java.beans.PropertyChangeEvent;
15  import java.beans.PropertyChangeListener;
16  import java.beans.PropertyChangeSupport;
17  import java.util.ArrayList;
18  import java.util.Collection;
19  import java.util.HashMap;
20  import java.util.HashSet;
21  import java.util.List;
22  import java.util.Map;
23  import java.util.Properties;
24  import java.util.Set;
25  
26  import javax.xml.namespace.QName;
27  
28  import com.eviware.soapui.model.ModelItem;
29  import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
30  import com.eviware.soapui.model.testsuite.TestProperty;
31  import com.eviware.soapui.model.testsuite.TestPropertyListener;
32  import com.eviware.soapui.support.types.StringToStringMap;
33  
34  public class RestRequestParamsPropertyHolder implements RestParamsPropertyHolder, TestPropertyListener
35  {
36  	private StringToStringMap values;
37  	private RestParamsPropertyHolder methodParams;
38  	private ModelItem modelItem;
39  	private Set<TestPropertyListener> listeners = new HashSet<TestPropertyListener>();
40  	private Map<RestParamProperty, InternalRestParamProperty> wrappers = new HashMap<RestParamProperty, InternalRestParamProperty>();
41  
42  	public RestRequestParamsPropertyHolder( RestParamsPropertyHolder methodParams, ModelItem modelItem,
43  			StringToStringMap values )
44  	{
45  		this.methodParams = methodParams;
46  		this.modelItem = modelItem;
47  		this.values = values;
48  		/*
49  		 * for (String key : methodParams.getPropertyNames()) { if
50  		 * (!values.containsKey(key) && methodParams.getPropertyValue(key) != null
51  		 * && !(methodParams.getPropertyValue(key).length() == 0)) {
52  		 * values.put(key, methodParams.getPropertyValue(key)); } }
53  		 */
54  		methodParams.addTestPropertyListener( this );
55  	}
56  
57  	public void reset( RestParamsPropertyHolder methodParams, StringToStringMap values )
58  	{
59  		this.methodParams = methodParams;
60  		this.values = values;
61  
62  		clearWrappers();
63  	}
64  
65  	private void clearWrappers()
66  	{
67  		for( InternalRestParamProperty property : wrappers.values() )
68  		{
69  			property.release();
70  		}
71  
72  		wrappers.clear();
73  	}
74  
75  	public RestParamProperty addProperty( String name )
76  	{
77  		return methodParams.addProperty( name );
78  	}
79  
80  	public void addParameter( RestParamProperty prop )
81  	{
82  		methodParams.addParameter( prop );
83  	}
84  
85  	public void addTestPropertyListener( TestPropertyListener listener )
86  	{
87  		listeners.add( listener );
88  	}
89  
90  	public void clear()
91  	{
92  		for( String key : getPropertyNames() )
93  		{
94  			String oldValue = getPropertyValue( key );
95  			values.put( key, "" );
96  			firePropertyValueChanged( key, oldValue, "" );
97  		}
98  	}
99  
100 	public boolean containsKey( Object key )
101 	{
102 		return methodParams.containsKey( key );
103 	}
104 
105 	public boolean containsValue( Object value )
106 	{
107 		return values.containsValue( value ) || methodParams.containsValue( value );
108 	}
109 
110 	public Set<Entry<String, TestProperty>> entrySet()
111 	{
112 		Set<Entry<String, TestProperty>> entrySet = methodParams.entrySet();
113 		for( Entry<String, TestProperty> entry : entrySet )
114 		{
115 			entry.setValue( getWrapper( ( RestParamProperty )entry.getValue() ) );
116 		}
117 		return entrySet;
118 	}
119 
120 	public RestParamProperty get( Object key )
121 	{
122 		if( !methodParams.containsKey( key ) )
123 			return null;
124 		return getWrapper( methodParams.get( key ) );
125 	}
126 
127 	public ModelItem getModelItem()
128 	{
129 		return methodParams.getModelItem();
130 	}
131 
132 	public Map<String, TestProperty> getProperties()
133 	{
134 		Map<String, TestProperty> map = methodParams.getProperties();
135 		for( String key : map.keySet() )
136 		{
137 			map.put( key, getWrapper( ( RestParamProperty )map.get( key ) ) );
138 		}
139 		return map;
140 	}
141 
142 	public String getPropertiesLabel()
143 	{
144 		return methodParams.getPropertiesLabel();
145 	}
146 
147 	public RestParamProperty getProperty( String name )
148 	{
149 		if( !methodParams.hasProperty( name ) )
150 			return null;
151 		return getWrapper( methodParams.getProperty( name ) );
152 	}
153 
154 	public RestParamProperty getPropertyAt( int index )
155 	{
156 		if( methodParams.getPropertyCount() <= index )
157 			return null;
158 		return getWrapper( methodParams.getPropertyAt( index ) );
159 	}
160 
161 	public int getPropertyCount()
162 	{
163 		return methodParams.getPropertyCount();
164 	}
165 
166 	public PropertyExpansion[] getPropertyExpansions()
167 	{
168 		return methodParams.getPropertyExpansions();
169 	}
170 
171 	public int getPropertyIndex( String name )
172 	{
173 		return methodParams.getPropertyIndex( name );
174 	}
175 
176 	public String[] getPropertyNames()
177 	{
178 		return methodParams.getPropertyNames();
179 	}
180 
181 	public String getPropertyValue( String name )
182 	{
183 		return values.containsKey( name ) ? values.get( name ) : methodParams.getPropertyValue( name );
184 	}
185 
186 	public boolean hasProperty( String name )
187 	{
188 		return methodParams.hasProperty( name );
189 	}
190 
191 	public boolean isEmpty()
192 	{
193 		return methodParams.isEmpty();
194 	}
195 
196 	public Set<String> keySet()
197 	{
198 		return methodParams.keySet();
199 	}
200 
201 	public void moveProperty( String propertyName, int targetIndex )
202 	{
203 		methodParams.moveProperty( propertyName, targetIndex );
204 	}
205 
206 	public TestProperty put( String key, TestProperty value )
207 	{
208 		if( value.getValue() != null )
209 			values.put( key, value.getValue() );
210 		else
211 			values.remove( key );
212 		return get( key );
213 	}
214 
215 	public void putAll( Map<? extends String, ? extends TestProperty> m )
216 	{
217 		// methodParams.putAll(m);
218 		for( Entry<? extends String, ? extends TestProperty> e : m.entrySet() )
219 			put( e.getKey(), e.getValue() );
220 	}
221 
222 	public TestProperty remove( Object key )
223 	{
224 		values.remove( key );
225 		return methodParams.get( key );
226 	}
227 
228 	public RestParamProperty removeProperty( String propertyName )
229 	{
230 		values.remove( propertyName );
231 		return methodParams.getProperty( propertyName );
232 	}
233 
234 	public void removeTestPropertyListener( TestPropertyListener listener )
235 	{
236 		listeners.remove( listener );
237 	}
238 
239 	public boolean renameProperty( String name, String newName )
240 	{
241 		values.put( newName, values.get( name ) );
242 		values.remove( name );
243 		return methodParams.renameProperty( name, newName );
244 	}
245 
246 	public void resetValues()
247 	{
248 		values.clear();
249 	}
250 
251 	public void release()
252 	{
253 		methodParams.removeTestPropertyListener( this );
254 		clearWrappers();
255 	}
256 
257 	public void saveTo( Properties props )
258 	{
259 		int count = getPropertyCount();
260 		for( int i = 0; i < count; i++ )
261 		{
262 			RestParamProperty p = getPropertyAt( i );
263 			String name = p.getName();
264 			String value = values.containsKey( name ) ? values.get( name ) : p.getValue();
265 			if( value == null )
266 				value = "";
267 
268 			props.setProperty( name, value );
269 		}
270 	}
271 
272 	public void setPropertiesLabel( String propertiesLabel )
273 	{
274 		// methodParams.setPropertiesLabel(propertiesLabel);
275 	}
276 
277 	public void setPropertyValue( String name, String value )
278 	{
279 		if( value == null )
280 			values.remove( name );
281 		else
282 			values.put( name, value );
283 	}
284 
285 	public int size()
286 	{
287 		return methodParams.size();
288 	}
289 
290 	public Collection<TestProperty> values()
291 	{
292 		List<TestProperty> ret = new ArrayList<TestProperty>();
293 		for( TestProperty p : methodParams.values() )
294 		{
295 			ret.add( getWrapper( ( RestParamProperty )p ) );
296 		}
297 		return ret;
298 	}
299 
300 	private void firePropertyAdded( String name )
301 	{
302 		TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
303 		for( TestPropertyListener listener : listenersArray )
304 		{
305 			listener.propertyAdded( name );
306 		}
307 	}
308 
309 	private void firePropertyRemoved( String name )
310 	{
311 		TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
312 		for( TestPropertyListener listener : listenersArray )
313 		{
314 			listener.propertyRemoved( name );
315 		}
316 	}
317 
318 	private void firePropertyMoved( String name, int oldIndex, int newIndex )
319 	{
320 		TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
321 		for( TestPropertyListener listener : listenersArray )
322 		{
323 			listener.propertyMoved( name, oldIndex, newIndex );
324 		}
325 	}
326 
327 	private void firePropertyRenamed( String oldName, String newName )
328 	{
329 		TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
330 		for( TestPropertyListener listener : listenersArray )
331 		{
332 			listener.propertyRenamed( oldName, newName );
333 		}
334 	}
335 
336 	private void firePropertyValueChanged( String name, String oldValue, String newValue )
337 	{
338 		TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
339 		for( TestPropertyListener listener : listenersArray )
340 		{
341 			listener.propertyValueChanged( name, oldValue, newValue );
342 		}
343 	}
344 
345 	private RestParamProperty getWrapper( RestParamProperty key )
346 	{
347 		if( !wrappers.containsKey( key ) )
348 		{
349 			wrappers.put( key, new InternalRestParamProperty( key ) );
350 		}
351 		return wrappers.get( key );
352 	}
353 
354 	public void propertyAdded( String name )
355 	{
356 		firePropertyAdded( name );
357 	}
358 
359 	public void propertyMoved( String name, int oldIndex, int newIndex )
360 	{
361 		firePropertyMoved( name, oldIndex, newIndex );
362 	}
363 
364 	public void propertyRemoved( String name )
365 	{
366 		values.remove( name );
367 		firePropertyRemoved( name );
368 	}
369 
370 	public void propertyRenamed( String oldName, String newName )
371 	{
372 		if( values.containsKey( oldName ) )
373 		{
374 			values.put( newName, values.get( oldName ) );
375 			values.remove( oldName );
376 		}
377 		firePropertyRenamed( oldName, newName );
378 	}
379 
380 	public void propertyValueChanged( String name, String oldValue, String newValue )
381 	{
382 		if( !values.containsKey( name ) )
383 			firePropertyValueChanged( name, oldValue, newValue );
384 	}
385 
386 	public class InternalRestParamProperty implements RestParamProperty, PropertyChangeListener
387 	{
388 		private RestParamProperty overriddenProp;
389 		private PropertyChangeSupport propertySupport;
390 
391 		public InternalRestParamProperty( RestParamProperty override )
392 		{
393 			overriddenProp = override;
394 			overriddenProp.addPropertyChangeListener( this );
395 			propertySupport = new PropertyChangeSupport( this );
396 		}
397 
398 		public void addPropertyChangeListener( PropertyChangeListener listener )
399 		{
400 			propertySupport.addPropertyChangeListener( listener );
401 		}
402 
403 		public void addPropertyChangeListener( String propertyName, PropertyChangeListener listener )
404 		{
405 			propertySupport.addPropertyChangeListener( propertyName, listener );
406 		}
407 
408 		public boolean isDisableUrlEncoding()
409 		{
410 			return overriddenProp.isDisableUrlEncoding();
411 		}
412 
413 		public void removePropertyChangeListener( PropertyChangeListener listener )
414 		{
415 			propertySupport.removePropertyChangeListener( listener );
416 		}
417 
418 		public void removePropertyChangeListener( String propertyName, PropertyChangeListener listener )
419 		{
420 			propertySupport.removePropertyChangeListener( propertyName, listener );
421 		}
422 
423 		public void setDisableUrlEncoding( boolean encode )
424 		{
425 			// overriddenProp.setDisableUrlEncoding(encode);
426 		}
427 
428 		public void setName( String name )
429 		{
430 			// overriddenProp.setName(name);
431 		}
432 
433 		public String getDefaultValue()
434 		{
435 			return overriddenProp.getDefaultValue();
436 		}
437 
438 		public String getDescription()
439 		{
440 			return overriddenProp.getDescription();
441 		}
442 
443 		public ModelItem getModelItem()
444 		{
445 			return modelItem;
446 		}
447 
448 		public String getName()
449 		{
450 			return overriddenProp.getName();
451 		}
452 
453 		public QName getType()
454 		{
455 			return overriddenProp.getType();
456 		}
457 
458 		public String getValue()
459 		{
460 			if( values.containsKey( getName() ) && values.get( getName() ) != null )
461 				return values.get( getName() );
462 			return getDefaultValue();
463 		}
464 
465 		public boolean isReadOnly()
466 		{
467 			return overriddenProp.isReadOnly();
468 		}
469 
470 		public void setValue( String value )
471 		{
472 			String oldValue = getValue();
473 			if( getDefaultValue() != null && getDefaultValue().equals( value ) )
474 				value = null;
475 			if( value == null )
476 				values.remove( getName() );
477 			else
478 				values.put( getName(), value );
479 			firePropertyValueChanged( getName(), oldValue, getValue() );
480 		}
481 
482 		public String[] getOptions()
483 		{
484 			return overriddenProp.getOptions();
485 		}
486 
487 		public boolean getRequired()
488 		{
489 			return overriddenProp.getRequired();
490 		}
491 
492 		public ParameterStyle getStyle()
493 		{
494 			return overriddenProp.getStyle();
495 		}
496 
497 		public void setDefaultValue( String default1 )
498 		{
499 			// overriddenProp.setDefaultValue(default1);
500 		}
501 
502 		public void setDescription( String description )
503 		{
504 			// overriddenProp.setDescription(description);
505 		}
506 
507 		public void setOptions( String[] arg0 )
508 		{
509 			// overriddenProp.setOptions(arg0);
510 		}
511 
512 		public void setRequired( boolean arg0 )
513 		{
514 			// overriddenProp.setRequired(arg0);
515 		}
516 
517 		public void setStyle( ParameterStyle style )
518 		{
519 			// overriddenProp.setStyle(style);
520 		}
521 
522 		public void setType( QName arg0 )
523 		{
524 			// overriddenProp.setType(arg0);
525 		}
526 
527 		public void propertyChange( PropertyChangeEvent evt )
528 		{
529 			propertySupport.firePropertyChange( evt );
530 		}
531 
532 		public void release()
533 		{
534 			overriddenProp.removePropertyChangeListener( this );
535 			overriddenProp = null;
536 			propertySupport = null;
537 		}
538 	}
539 
540 	public List<TestProperty> getPropertyList()
541 	{
542 		return methodParams.getPropertyList();
543 	}
544 
545 }