
com.progressoft.brix.domino.api.server.request.DefaultMultiMap Maven / Gradle / Ivy
The newest version!
package com.progressoft.brix.domino.api.server.request;
import java.util.*;
import static java.util.Objects.nonNull;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toCollection;
public class DefaultMultiMap implements MultiMap {
protected Map> values = new LinkedHashMap<>();
@Override
public V get(K name) {
if (!contains(name))
return null;
return getAll(name).get(0);
}
@Override
public List getAll(K name) {
if (!contains(name))
return new LinkedList<>();
return new LinkedList<>(values.get(name));
}
@Override
public List> entries() {
return values.keySet()
.stream()
.filter(key -> nonNull(values.get(key)))
.map(this::asEntries)
.flatMap(Collection::stream)
.collect(toCollection(LinkedList::new));
}
private List asEntries(K key) {
return getAll(key).stream().map(value -> new Entry(key, value)).collect(toCollection(LinkedList::new));
}
@Override
public boolean contains(K name) {
return values.containsKey(name);
}
@Override
public boolean isEmpty() {
return values.isEmpty();
}
@Override
public Set names() {
return values.keySet();
}
@Override
public MultiMap add(K name, V value) {
requireNonNull(name);
requireNonNull(value);
if (!contains(name))
values.put(name, new ArrayList<>());
values.get(name).add(value);
return this;
}
@Override
public MultiMap add(K name, Iterable values) {
requireNonNull(values);
values.forEach(value -> add(name, value));
return this;
}
@Override
public MultiMap addAll(MultiMap map) {
requireNonNull(map);
map.entries().forEach(entry -> this.add(entry.getKey(), entry.getValue()));
return this;
}
@Override
public MultiMap addAll(Map values) {
requireNonNull(values);
values.forEach(this::add);
return this;
}
@Override
public MultiMap set(K name, V value) {
requireNonNull(name);
requireNonNull(value);
clearItem(name);
add(name, value);
return this;
}
@Override
public MultiMap set(K name, Iterable values) {
clearItem(name);
add(name, values);
return this;
}
private void clearItem(K name) {
values.put(name, new LinkedList<>());
}
@Override
public MultiMap setAll(MultiMap map) {
requireNonNull(map);
clear();
addAll(map);
return this;
}
@Override
public MultiMap setAll(Map values) {
requireNonNull(values);
clear();
addAll(values);
return this;
}
@Override
public MultiMap remove(K name) {
requireNonNull(name);
values.remove(name);
return this;
}
@Override
public MultiMap clear() {
values = new LinkedHashMap<>();
return this;
}
@Override
public int size() {
return values.size();
}
@Override
public Iterator> iterator() {
return entries().iterator();
}
private class Entry implements Map.Entry {
private K key;
private V value;
private Entry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
this.value = value;
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof Map.Entry)) return false;
Map.Entry entry = (Map.Entry) o;
if (key != null ? !key.equals(entry.getKey()) : entry.getKey() != null) return false;
return value != null ? value.equals(entry.getValue()) : entry.getValue() == null;
}
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Entry[" +
"key=\"" + key + "\"" +
", value=\"" + value + "\"" +
"]";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy