/** * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.gistlabs.mechanize.headers; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Representation of a header list being able to use multiple String values for a single parameter. */ public class Headers implements Iterable<Header> { private final LinkedHashMap<String, Header> headers = new LinkedHashMap<String, Header>(); public Headers() { } public Headers(final Map<String, Object> parameters) { List<String> sortedKeys = new ArrayList<String>(parameters.keySet()); for(String name : sortedKeys) { Object value = parameters.get(name); if(value != null && !(value instanceof String [])) add(name, value.toString()); else if(value instanceof String []) add(name, (String [])value); } } /** Returns true if at least one value is present for the given header name. */ public boolean has(final String name) { return this.headers.containsKey(name); } /** Returns the current values of the headers in natural sort order or null if none. */ public String [] get(final String name) { if(has(name)) { List<String> values = headers.get(name).getValues(); return values.toArray(new String [values.size()]); } else return null; } /** Returns the header names in the order they where added. */ public String [] getNames() { String [] result = new String[headers.size()]; headers.keySet().toArray(result); return result; } public Headers set(final String name, final String ... values) { remove(name); add(name, values); return this; } public Headers remove(final String name) { headers.remove(name); return this; } public Headers add(final String name, final String ... values) { for(String value : values) add(name, value); return this; } public Headers set(final String name, final String value) { remove(name); add(name, value); return this; } public Headers add(final String name, final String value) { if(has(name)) headers.get(name).addValue(value); else headers.put(name, new Header(name, value)); return this; } public Collection<Header> getHeaderss() { return headers.values(); } @Override public Iterator<Header> iterator() { return headers.values().iterator(); } /** Returns the sum of all values within the header collection. */ public int getValueCount() { int count = 0; for (Header header : this) count += header.getValues().size(); return count; } @Override public String toString() { return headers.toString(); } }