2 * Copyright (c) 2017 Inocybe Technologies and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.restconf.common.util;
10 import java.util.Collection;
11 import java.util.HashMap;
12 import java.util.LinkedList;
13 import java.util.List;
15 import java.util.Objects;
17 import javax.ws.rs.core.MultivaluedMap;
20 * A hash table based implementation of {@link MultivaluedMap} interface.
22 * @author Thomas Pantelis
24 public class MultivaluedHashMap<K, V> implements MultivaluedMap<K, V> {
25 private final Map<K, List<V>> store = new HashMap<>();
28 public final void putSingle(K key, V value) {
29 List<V> values = getValues(key);
38 public void add(K key, V value) {
39 List<V> values = getValues(key);
47 public void addAll(K key, V... newValues) {
48 Objects.requireNonNull(newValues, "Supplied array of values must not be null.");
50 if (newValues.length == 0) {
54 List<V> values = getValues(key);
55 for (V value : newValues) {
63 public void addAll(K key, List<V> valueList) {
64 Objects.requireNonNull(valueList, "Supplied list of values must not be null.");
66 if (valueList.isEmpty()) {
70 List<V> values = getValues(key);
71 for (V value : valueList) {
79 public void addFirst(K key, V value) {
80 List<V> values = getValues(key);
88 public V getFirst(K key) {
89 List<V> values = store.get(key);
90 if (values != null && values.size() > 0) {
98 public boolean equalsIgnoreValueOrder(MultivaluedMap<K, V> omap) {
102 if (!keySet().equals(omap.keySet())) {
105 for (Entry<K, List<V>> e : entrySet()) {
106 List<V> olist = omap.get(e.getKey());
107 if (e.getValue().size() != olist.size()) {
110 for (V v : e.getValue()) {
111 if (!olist.contains(v)) {
120 public Collection<List<V>> values() {
121 return store.values();
130 public List<V> remove(Object key) {
131 return store.remove(key);
135 public void putAll(Map<? extends K, ? extends List<V>> map) {
140 public List<V> put(K key, List<V> value) {
141 return store.put(key, value);
145 public Set<K> keySet() {
146 return store.keySet();
150 public boolean isEmpty() {
151 return store.isEmpty();
155 public List<V> get(Object key) {
156 return store.get(key);
160 public Set<Entry<K, List<V>>> entrySet() {
161 return store.entrySet();
165 public boolean containsValue(Object value) {
166 return store.containsValue(value);
170 public boolean containsKey(Object key) {
171 return store.containsKey(key);
175 public void clear() {
179 private List<V> getValues(K key) {
180 return store.computeIfAbsent(key, k -> new LinkedList<>());