package org.jboss.pitbull.internal.util; import org.jboss.pitbull.OrderedHeaders; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * Header order is remembered. * * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class OrderedHeadersImpl implements OrderedHeaders { protected List<Map.Entry<String, String>> headerList = new ArrayList<Map.Entry<String, String>>(); protected CaseInsensitiveMap<Map.Entry<String, String>> headerMap = new CaseInsensitiveMap<Map.Entry<String, String>>(); private static class HeaderEntry implements Map.Entry<String, String> { private String name; private String value; private HeaderEntry(String name, String value) { this.name = name; this.value = value; } @Override public String getKey() { return name; } @Override public String getValue() { return value; } @Override public String setValue(String s) { return value = s; } } @Override public boolean containsHeader(String name) { return headerMap.containsKey(name); } @Override public void clear() { headerMap.clear(); headerList.clear(); } @Override public List<Map.Entry<String, String>> getHeaderList() { return headerList; } @Override public Set<String> getHeaderNames() { return headerMap.keySet(); } @Override public List<String> getHeaderValues(String name) { List<String> values = new ArrayList<String>(); List<Map.Entry<String, String>> entries = headerMap.get(name); if (entries == null) return values; for (Map.Entry<String, String> entry : entries) { values.add(entry.getValue()); } return values; } @Override public String getFirstHeader(String name) { Map.Entry<String, String> entry = headerMap.getFirst(name); if (entry == null) return null; return entry.getValue(); } @Override public void addHeader(String name, String value) { if (value == null) return; value = value.trim(); Map.Entry<String, String> entry = new HeaderEntry(name, value); headerList.add(entry); headerMap.add(name, entry); } @Override public void setHeader(String name, String value) { removeHeader(name); if (value != null) addHeader(name, value); } @Override public void removeHeader(String name) { List<Map.Entry<String, String>> values = headerMap.remove(name); if (values != null) { for (Map.Entry<String, String> entry : values) { headerList.remove(entry); } } } }