/*
* 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.HashMap;
import java.util.Map;
/**
* HashMap<String,String>
*
* @author Ole.Matzura
*/
public class StringToStringMap extends HashMap<String, String> {
private boolean equalsOnThis;
public StringToStringMap() {
super();
}
public StringToStringMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
}
public StringToStringMap(int initialCapacity) {
super(initialCapacity);
}
public StringToStringMap(Map<? extends String, ? extends String> m) {
super(m);
}
public String get(String key, String defaultValue) {
String value = get(key);
return value == null ? defaultValue : value;
}
/**
* Get the inverse of this map.
*/
public StringToStringMap inverse() {
StringToStringMap inverse = new StringToStringMap();
for (String key : keySet()) {
String value = get(key);
inverse.put(value, key);
}
return inverse;
}
public String toXml() {
StringToStringMapConfig xmlConfig = StringToStringMapConfig.Factory.newInstance();
for (String key : keySet()) {
StringToStringMapConfig.Entry entry = xmlConfig.addNewEntry();
entry.setKey(key);
entry.setValue(get(key));
}
return xmlConfig.toString();
}
public static StringToStringMap fromXml(String value) {
if (value == null || value.trim().length() == 0 || value.equals("<xml-fragment/>")) {
return new StringToStringMap();
}
try {
StringToStringMapConfig nsMapping = StringToStringMapConfig.Factory.parse(value);
return fromXml(nsMapping);
} catch (Exception e) {
SoapUI.logError(e);
}
return new StringToStringMap();
}
public static StringToStringMap fromXml(StringToStringMapConfig nsMapping) {
StringToStringMap result = new StringToStringMap();
for (StringToStringMapConfig.Entry entry : nsMapping.getEntryList()) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public final boolean getBoolean(String key) {
return Boolean.parseBoolean(get(key));
}
public boolean hasValue(String key) {
return containsKey(key) && get(key).length() > 0;
}
public void putIfMissing(String key, String value) {
if (!containsKey(key)) {
put(key, value);
}
}
public void put(String key, boolean value) {
put(key, Boolean.toString(value));
}
public static StringToStringMap fromHttpHeader(String value) {
StringToStringMap result = new StringToStringMap();
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, StringToStringMap 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.put(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 int getInt(String key, int def) {
try {
return Integer.parseInt(get(key));
} catch (Exception e) {
return def;
}
}
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;
}
}