/* * Copyright (c) 2017 Inocybe Technologies and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.restconf.common.util; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import javax.ws.rs.core.MultivaluedMap; /** * A hash table based implementation of {@link MultivaluedMap} interface. * * @author Thomas Pantelis */ public class MultivaluedHashMap implements MultivaluedMap { private final Map> store = new HashMap<>(); @Override public final void putSingle(K key, V value) { List values = getValues(key); values.clear(); if (value != null) { values.add(value); } } @Override public void add(K key, V value) { List values = getValues(key); if (value != null) { values.add(value); } } @Override @SafeVarargs public final void addAll(K key, V... newValues) { addAll(key, Arrays.asList(newValues)); } @Override public void addAll(K key, List valueList) { Objects.requireNonNull(valueList, "Supplied list of values must not be null."); if (valueList.isEmpty()) { return; } List values = getValues(key); for (V value : valueList) { if (value != null) { values.add(value); } } } @Override public void addFirst(K key, V value) { List values = getValues(key); if (value != null) { values.add(0, value); } } @Override public V getFirst(K key) { List values = store.get(key); if (values != null && values.size() > 0) { return values.get(0); } else { return null; } } @Override public boolean equalsIgnoreValueOrder(MultivaluedMap omap) { if (this == omap) { return true; } if (!keySet().equals(omap.keySet())) { return false; } for (Entry> e : entrySet()) { List olist = omap.get(e.getKey()); if (e.getValue().size() != olist.size()) { return false; } for (V v : e.getValue()) { if (!olist.contains(v)) { return false; } } } return true; } @Override public Collection> values() { return store.values(); } @Override public int size() { return store.size(); } @Override public List remove(Object key) { return store.remove(key); } @Override public void putAll(Map> map) { store.putAll(map); } @Override public List put(K key, List value) { return store.put(key, value); } @Override public Set keySet() { return store.keySet(); } @Override public boolean isEmpty() { return store.isEmpty(); } @Override public List get(Object key) { return store.get(key); } @Override public Set>> entrySet() { return store.entrySet(); } @Override public boolean containsValue(Object value) { return store.containsValue(value); } @Override public boolean containsKey(Object key) { return store.containsKey(key); } @Override public void clear() { store.clear(); } private List getValues(K key) { return store.computeIfAbsent(key, k -> new LinkedList<>()); } }