package com.android.server.wifi.hotspot2.omadm; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class MultiValueMap { private final Map> mMap = new LinkedHashMap<>(); public void put(String key, T value) { key = key.toLowerCase(); ArrayList values = mMap.get(key); if (values == null) { values = new ArrayList<>(); mMap.put(key, values); } values.add(value); } public T get(String key) { key = key.toLowerCase(); List values = mMap.get(key); if (values == null) { return null; } else if (values.size() == 1) { return values.get(0); } else { throw new IllegalArgumentException("Cannot do get on multi-value"); } } public T replace(String key, T oldValue, T newValue) { key = key.toLowerCase(); List values = mMap.get(key); if (values == null) { return null; } for (int n = 0; n < values.size(); n++) { T value = values.get(n); if (value == oldValue) { values.set(n, newValue); return value; } } return null; } public T remove(String key, T value) { key = key.toLowerCase(); List values = mMap.get(key); if (values == null) { return null; } T result = null; Iterator valueIterator = values.iterator(); while (valueIterator.hasNext()) { if (valueIterator.next() == value) { valueIterator.remove(); result = value; break; } } if (values.isEmpty()) { mMap.remove(key); } return result; } public T remove(T value) { T result = null; Iterator>> iterator = mMap.entrySet().iterator(); while (iterator.hasNext()) { ArrayList values = iterator.next().getValue(); Iterator valueIterator = values.iterator(); while (valueIterator.hasNext()) { if (valueIterator.next() == value) { valueIterator.remove(); result = value; break; } } if (result != null) { if (values.isEmpty()) { iterator.remove(); } break; } } return result; } public Collection values() { List allValues = new ArrayList<>(mMap.size()); for (List values : mMap.values()) { for (T value : values) { allValues.add(value); } } return allValues; } public T getSingletonValue() { if (mMap.size() != 1) { throw new IllegalArgumentException("Map is not a single entry map"); } List values = mMap.values().iterator().next(); if (values.size() != 1) { throw new IllegalArgumentException("Map is not a single entry map"); } return values.iterator().next(); } }