package com.vtence.molecule.helpers; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; public class Headers { private final Map<String, List<String>> values = new HashMap<>(); private final Map<String, String> names = new LinkedHashMap<>(); public String get(String name) { return has(name) ? Joiner.on(", ").join(values(name)) : null; } public List<String> list(String name) { return new ArrayList<>(values(name)); } public boolean has(String name) { return values.containsKey(name) && !list(name).isEmpty() || values.containsKey(canonicalForm(name)) && !list(canonicalForm(name)).isEmpty(); } public int size() { return values.size(); } public Set<String> names() { return new LinkedHashSet<>(names.values()); } public Map<String, String> all() { Map<String, String> headers = new LinkedHashMap<>(); for (String name : names()) { headers.put(name, get(name)); } return headers; } public void put(String name, String value) { List<String> all = values(name); all.clear(); add(name, value); } public void add(String name, String value) { if (value == null) return; values(name).add(value); if (literalForm(name) != null && !literalForm(name).equals(name)) { names.remove(literalForm(name)); } names.put(canonicalForm(name), name); names.put(name, name); } public void remove(String name) { names.remove(literalForm(name)); names.remove(canonicalForm(name)); values.remove(canonicalForm(name)); } private String literalForm(String name) { return names.get(canonicalForm(name)); } private String canonicalForm(String name) { return name.toLowerCase(); } private List<String> values(String name) { if (!values.containsKey(canonicalForm(name))) { values.put(canonicalForm(name), new ArrayList<>()); } return values.get(canonicalForm(name)); } }