package rocks.inspectit.ui.rcp.preferences.valueproviders;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.collections.MapUtils;
import rocks.inspectit.ui.rcp.preferences.PreferenceException;
import rocks.inspectit.ui.rcp.preferences.PreferencesConstants;
import rocks.inspectit.ui.rcp.preferences.valueproviders.PreferenceValueProviderFactory.PreferenceValueProvider;
/**
* This {@link PreferenceValueProvider} converts any map that has keys and values in primitive
* warper types to preference value. Later on this preference value will be transformed to a map
* that has both string as key and value, and thus needs transformation to initial classes of keys
* and values.
*
* @author Ivan Senic
*
*/
public class MapPreferenceValueProvider extends PreferenceValueProvider<Map<?, ?>> {
/**
* Constant for denoting the empty map.
*/
private static final String EMPTY_MAP = "EMPTY_MAP";
/**
* {@inheritDoc}
*/
@Override
public boolean isObjectValid(Object object) {
return object instanceof Map;
}
/**
* {@inheritDoc}
*/
@Override
public String getValueForObject(Map<?, ?> map) throws PreferenceException {
if (MapUtils.isEmpty(map)) {
return EMPTY_MAP;
} else {
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<?, ?> entry : map.entrySet()) {
stringBuilder.append(String.valueOf(entry.getKey()));
stringBuilder.append(PreferencesConstants.PREF_SPLIT_REGEX);
stringBuilder.append(entry.getValue());
stringBuilder.append(PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN);
}
return stringBuilder.toString();
}
}
/**
* {@inheritDoc}
*/
@Override
public Map<?, ?> getObjectFromValue(String value) throws PreferenceException {
if (EMPTY_MAP.equals(value)) {
return Collections.emptyMap();
} else {
Map<String, String> map = new HashMap<>();
StringTokenizer tokenizer = new StringTokenizer(value, PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN);
while (tokenizer.hasMoreElements()) {
String nextEntry = tokenizer.nextToken();
String[] splitted = nextEntry.split(PreferencesConstants.PREF_SPLIT_REGEX);
if (splitted.length == 2) {
map.put(splitted[0], splitted[1]);
} else {
throw new PreferenceException("Error loading map entry for the map saved in the preference store are not correct. Entry key and value received values via the string '" + nextEntry
+ "' are " + Arrays.asList(splitted) + ". Definition will be skipped.");
}
}
return map;
}
}
}