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  
13  package com.eviware.soapui.support.types;
14  
15  import java.util.ArrayList;
16  import java.util.HashMap;
17  import java.util.List;
18  import java.util.Map;
19  
20  import com.eviware.soapui.SoapUI;
21  import com.eviware.soapui.config.StringToStringMapConfig;
22  import com.eviware.soapui.config.StringToStringMapConfig.Entry;
23  
24  /***
25   * HashMap<String,String>
26   * 
27   * @author Ole.Matzura
28   */
29  
30  public class StringToStringsMap extends HashMap<String, List<String>>
31  {
32  	private boolean equalsOnThis;
33  
34  	public StringToStringsMap()
35  	{
36  		super();
37  	}
38  
39  	public StringToStringsMap( int initialCapacity, float loadFactor )
40  	{
41  		super( initialCapacity, loadFactor );
42  	}
43  
44  	public StringToStringsMap( int initialCapacity )
45  	{
46  		super( initialCapacity );
47  	}
48  
49  	public StringToStringsMap( Map<? extends String, ? extends List<String>> m )
50  	{
51  		super( m );
52  	}
53  
54  	public StringToStringsMap( StringToStringMap map )
55  	{
56  		super();
57  
58  		for( String key : map.keySet() )
59  			put( key, map.get( key ) );
60  	}
61  
62  	public List<String> get( String key, List<String> defaultValue )
63  	{
64  		List<String> value = get( key );
65  		return value == null ? defaultValue : value;
66  	}
67  
68  	/***
69  	 * Get the inverse of this map.
70  	 */
71  
72  	public String toXml()
73  	{
74  		StringToStringMapConfig xmlConfig = StringToStringMapConfig.Factory.newInstance();
75  
76  		for( String key : keySet() )
77  		{
78  			for( String value : get( key ) )
79  			{
80  				Entry entry = xmlConfig.addNewEntry();
81  				entry.setKey( key );
82  				entry.setValue( value );
83  			}
84  		}
85  
86  		return xmlConfig.toString();
87  	}
88  
89  	public static StringToStringsMap fromXml( String value )
90  	{
91  		if( value == null || value.trim().length() == 0 || value.equals( "<xml-fragment/>" ) )
92  			return new StringToStringsMap();
93  
94  		try
95  		{
96  			StringToStringMapConfig nsMapping = StringToStringMapConfig.Factory.parse( value );
97  
98  			return fromXml( nsMapping );
99  		}
100 		catch( Exception e )
101 		{
102 			SoapUI.logError( e );
103 		}
104 
105 		return new StringToStringsMap();
106 	}
107 
108 	public static StringToStringsMap fromXml( StringToStringMapConfig nsMapping )
109 	{
110 		StringToStringsMap result = new StringToStringsMap();
111 		for( Entry entry : nsMapping.getEntryList() )
112 		{
113 			result.add( entry.getKey(), entry.getValue() );
114 		}
115 		return result;
116 	}
117 
118 	public boolean hasValues( String key )
119 	{
120 		return containsKey( key ) && get( key ).size() > 0;
121 	}
122 
123 	public void add( String key, boolean value )
124 	{
125 		add( key, Boolean.toString( value ) );
126 	}
127 
128 	public void add( String key, String string )
129 	{
130 		if( !containsKey( key ) )
131 			put( key, new ArrayList<String>() );
132 
133 		get( key ).add( string );
134 	}
135 
136 	public static StringToStringsMap fromHttpHeader( String value )
137 	{
138 		StringToStringsMap result = new StringToStringsMap();
139 
140 		int ix = value.indexOf( ';' );
141 		while( ix > 0 )
142 		{
143 			extractNVPair( value.substring( 0, ix ), result );
144 			value = value.substring( ix + 1 );
145 			ix = value.indexOf( ';' );
146 		}
147 
148 		if( value.length() > 2 )
149 		{
150 			extractNVPair( value, result );
151 		}
152 
153 		return result;
154 	}
155 
156 	private static void extractNVPair( String value, StringToStringsMap result )
157 	{
158 		int ix;
159 		ix = value.indexOf( '=' );
160 		if( ix != -1 )
161 		{
162 			String str = value.substring( ix + 1 ).trim();
163 			if( str.startsWith( "\"" ) && str.endsWith( "\"" ) )
164 				str = str.substring( 1, str.length() - 1 );
165 
166 			result.add( value.substring( 0, ix ).trim(), str );
167 		}
168 	}
169 
170 	public void setEqualsOnThis( boolean equalsOnThis )
171 	{
172 		this.equalsOnThis = equalsOnThis;
173 	}
174 
175 	@Override
176 	public boolean equals( Object o )
177 	{
178 		return equalsOnThis ? this == o : super.equals( o );
179 	}
180 
181 	public String[] getKeys()
182 	{
183 		return keySet().toArray( new String[size()] );
184 	}
185 
186 	public boolean containsKeyIgnoreCase( String string )
187 	{
188 		for( String key : keySet() )
189 		{
190 			if( key.equalsIgnoreCase( string ) )
191 				return true;
192 		}
193 
194 		return false;
195 	}
196 
197 	public void put( String name, String value )
198 	{
199 		add( name, value );
200 	}
201 
202 	public String get( String key, String defaultValue )
203 	{
204 		List<String> value = get( key );
205 		if( value == null || value.size() == 0 )
206 			return defaultValue;
207 
208 		return value.get( 0 );
209 
210 	}
211 
212 	public StringToStringMap toStringToStringMap()
213 	{
214 		StringToStringMap result = new StringToStringMap();
215 
216 		for( String key : keySet() )
217 		{
218 			List<String> list = get( key );
219 			if( list.size() == 1 )
220 				result.put( key, list.get( 0 ) );
221 			else
222 				result.put( key, list.toString() );
223 		}
224 
225 		return result;
226 	}
227 
228 	public void replace( String key, String oldValue, String value )
229 	{
230 		List<String> values = get( key );
231 		if( values == null )
232 			return;
233 
234 		int ix = values.indexOf( oldValue );
235 		if( ix >= 0 )
236 			values.set( ix, value );
237 	}
238 
239 	public void remove( String key, String data )
240 	{
241 		List<String> values = get( key );
242 		if( values == null )
243 			return;
244 
245 		values.remove( data );
246 	}
247 
248 	public int valueCount()
249 	{
250 		int result = 0;
251 
252 		for( String key : keySet() )
253 			result += get( key ).size();
254 
255 		return result;
256 	}
257 
258 	public String toString()
259 	{
260 		StringBuffer result = new StringBuffer();
261 
262 		for( String key : keySet() )
263 		{
264 			for( String value : get( key ) )
265 			{
266 				result.append( key ).append( " : " ).append( value ).append( "\r\n" );
267 			}
268 		}
269 
270 		return result.toString();
271 	}
272 }