1
2
3
4
5
6
7
8
9
10
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 }