/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support.types; import com.eviware.soapui.SoapUI; import com.eviware.soapui.config.StringToStringMapConfig; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * HashMap<String,String> * * @author Ole.Matzura */ public class StringToStringsMap extends HashMap<String, List<String>> { private boolean equalsOnThis; public StringToStringsMap() { super(); } public StringToStringsMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); } public StringToStringsMap(int initialCapacity) { super(initialCapacity); } public StringToStringsMap(Map<? extends String, ? extends List<String>> m) { super(m); } public StringToStringsMap(StringToStringMap map) { super(); for (String key : map.keySet()) { put(key, map.get(key)); } } public List<String> get(String key, List<String> defaultValue) { List<String> value = get(key); return value == null ? defaultValue : value; } /** * Get the inverse of this map. */ public String toXml() { StringToStringMapConfig xmlConfig = StringToStringMapConfig.Factory.newInstance(); for (String key : keySet()) { for (String value : get(key)) { StringToStringMapConfig.Entry entry = xmlConfig.addNewEntry(); entry.setKey(key); entry.setValue(value); } } return xmlConfig.toString(); } public static StringToStringsMap fromXml(String value) { if (value == null || value.trim().length() == 0 || value.equals("<xml-fragment/>")) { return new StringToStringsMap(); } try { StringToStringMapConfig nsMapping = StringToStringMapConfig.Factory.parse(value); return fromXml(nsMapping); } catch (Exception e) { SoapUI.logError(e); } return new StringToStringsMap(); } public static StringToStringsMap fromXml(StringToStringMapConfig nsMapping) { StringToStringsMap result = new StringToStringsMap(); for (StringToStringMapConfig.Entry entry : nsMapping.getEntryList()) { result.add(entry.getKey(), entry.getValue()); } return result; } public boolean hasValues(String key) { return containsKey(key) && get(key).size() > 0; } public void add(String key, boolean value) { add(key, Boolean.toString(value)); } public void add(String key, String string) { if (!containsKey(key)) { put(key, new ArrayList<String>()); } get(key).add(string); } public static StringToStringsMap fromHttpHeader(String value) { StringToStringsMap result = new StringToStringsMap(); int ix = value.indexOf(';'); while (ix > 0) { extractNVPair(value.substring(0, ix), result); value = value.substring(ix + 1); ix = value.indexOf(';'); } if (value.length() > 2) { extractNVPair(value, result); } return result; } private static void extractNVPair(String value, StringToStringsMap result) { int ix; ix = value.indexOf('='); if (ix != -1) { String str = value.substring(ix + 1).trim(); if (str.startsWith("\"") && str.endsWith("\"")) { str = str.substring(1, str.length() - 1); } result.add(value.substring(0, ix).trim(), str); } } public void setEqualsOnThis(boolean equalsOnThis) { this.equalsOnThis = equalsOnThis; } @Override public boolean equals(Object o) { return equalsOnThis ? this == o : super.equals(o); } public String[] getKeys() { return keySet().toArray(new String[size()]); } public boolean containsKeyIgnoreCase(String string) { for (String key : keySet()) { if (key.equalsIgnoreCase(string)) { return true; } } return false; } public void put(String name, String value) { add(name, value); } public String get(String key, String defaultValue) { List<String> value = get(key); if (value == null || value.size() == 0) { return defaultValue; } return value.get(0); } public String getCaseInsensitive(String key, String defaultValue) { for (Map.Entry<String, List<String>> stringListEntry : entrySet()) { if (key.equalsIgnoreCase(stringListEntry.getKey()) && !stringListEntry.getValue().isEmpty()) { return stringListEntry.getValue().get(0); } } return defaultValue; } public StringToStringMap toStringToStringMap() { StringToStringMap result = new StringToStringMap(); for (String key : keySet()) { List<String> list = get(key); if (list.size() == 1) { result.put(key, list.get(0)); } else { result.put(key, list.toString()); } } return result; } public void replace(String key, String oldValue, String value) { List<String> values = get(key); if (values == null) { return; } int ix = values.indexOf(oldValue); if (ix >= 0) { values.set(ix, value); } } public void remove(String key, String data) { List<String> values = get(key); if (values == null) { return; } values.remove(data); } public int valueCount() { int result = 0; for (String key : keySet()) { result += get(key).size(); } return result; } public String toString() { StringBuilder result = new StringBuilder(); for (String key : keySet()) { for (String value : get(key)) { result.append(key).append(" : ").append(value).append("\r\n"); } } return result.toString(); } }