/* * Copyright 2014 cruxframework.org. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.cruxframework.crux.core.server.rest.spi; import java.net.URI; import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.cruxframework.crux.core.server.rest.core.CacheControl; import org.cruxframework.crux.core.server.rest.core.Cookie; import org.cruxframework.crux.core.server.rest.core.EntityTag; import org.cruxframework.crux.core.server.rest.core.MediaType; import org.cruxframework.crux.core.server.rest.core.MultivaluedMap; import org.cruxframework.crux.core.server.rest.core.NewCookie; import org.cruxframework.crux.core.server.rest.util.CaseInsensitiveMap; import org.cruxframework.crux.core.server.rest.util.header.CacheControlHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.CookieHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.EntityTagHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.LocaleHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.MediaTypeHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.NewCookieHeaderParser; import org.cruxframework.crux.core.server.rest.util.header.UriHeaderParser; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class HttpServletResponseHeaders implements MultivaluedMap<String, Object> { @SuppressWarnings("rawtypes") private CaseInsensitiveMap cachedHeaders = new CaseInsensitiveMap(); private HttpServletResponse response; public HttpServletResponseHeaders(HttpServletResponse response) { this.response = response; } @Override public void addAll(String key, Object... newValues) { for (Object value : newValues) { add(key, value); } } @Override public void addAll(String key, List<Object> valueList) { for (Object value : valueList) { add(key, value); } } @Override public void addFirst(String key, Object value) { List<Object> list = get(key); if (list == null) { add(key, value); return; } else { list.add(0, value); } } @SuppressWarnings("unchecked") public void putSingle(String key, Object value) { cachedHeaders.putSingle(key, value); if (value instanceof Cookie) { response.setHeader(key, CookieHeaderParser.toString((Cookie) value)); } else if (value instanceof NewCookie) { response.setHeader(key, NewCookieHeaderParser.toString((NewCookie) value)); } else if (value instanceof CacheControl) { response.setHeader(key, CacheControlHeaderParser.toString((CacheControl) value)); } else if (value instanceof URI) { response.setHeader(key, UriHeaderParser.toString((URI) value)); } else if (value instanceof Locale) { response.setHeader(key, LocaleHeaderParser.toString((Locale) value)); } else if (value instanceof MediaType) { response.setHeader(key, MediaTypeHeaderParser.toString((MediaType) value)); } else if (value instanceof EntityTag) { response.setHeader(key, EntityTagHeaderParser.toString((EntityTag) value)); } else { response.setHeader(key, value.toString()); } } @SuppressWarnings("unchecked") public void add(String key, Object value) { cachedHeaders.add(key, value); addResponseHeader(key, value); } protected void addResponseHeader(String key, Object value) { if (value instanceof Cookie) { response.addHeader(key, CookieHeaderParser.toString((Cookie) value)); } else if (value instanceof NewCookie) { response.addHeader(key, NewCookieHeaderParser.toString((NewCookie) value)); } else if (value instanceof CacheControl) { response.addHeader(key, CacheControlHeaderParser.toString((CacheControl) value)); } else if (value instanceof URI) { response.addHeader(key, UriHeaderParser.toString((URI) value)); } else if (value instanceof Locale) { response.addHeader(key, LocaleHeaderParser.toString((Locale) value)); } else if (value instanceof MediaType) { response.addHeader(key, MediaTypeHeaderParser.toString((MediaType) value)); } else if (value instanceof EntityTag) { response.addHeader(key, EntityTagHeaderParser.toString((EntityTag) value)); } else { response.addHeader(key, value.toString()); } } public Object getFirst(String key) { return cachedHeaders.getFirst(key); } public int size() { return cachedHeaders.size(); } public boolean isEmpty() { return cachedHeaders.isEmpty(); } public boolean containsKey(Object o) { return cachedHeaders.containsKey(o); } public boolean containsValue(Object o) { return cachedHeaders.containsValue(o); } @SuppressWarnings("unchecked") public List<Object> get(Object o) { return cachedHeaders.get(o); } @SuppressWarnings("unchecked") public List<Object> put(String s, List<Object> objs) { for (Object obj : objs) { addResponseHeader(s, obj); } return cachedHeaders.put(s, objs); } public List<Object> remove(Object o) { throw new RuntimeException("Removing a header is illegal for an HttpServletResponse"); } public void putAll(Map<? extends String, ? extends List<Object>> map) { for (Map.Entry<? extends String, ? extends List<Object>> entry : map.entrySet()) { List<Object> objs = entry.getValue(); for (Object obj : objs) { add(entry.getKey(), obj); } } } public void clear() { throw new RuntimeException("Removing a header is illegal for an HttpServletResponse"); } @SuppressWarnings("unchecked") public Set<String> keySet() { return cachedHeaders.keySet(); } @SuppressWarnings("unchecked") public Collection<List<Object>> values() { return cachedHeaders.values(); } @SuppressWarnings("unchecked") public Set<Entry<String, List<Object>>> entrySet() { return cachedHeaders.entrySet(); } public boolean equals(Object o) { return cachedHeaders.equals(o); } public int hashCode() { return cachedHeaders.hashCode(); } @SuppressWarnings("unchecked") @Override public boolean equalsIgnoreValueOrder(MultivaluedMap<String, Object> otherMap) { return cachedHeaders.equalsIgnoreValueOrder(otherMap); } public void addDateHeader(String name, long date) { response.addDateHeader(name, date); } }