removed working file
git-svn-id: https://svn.apache.org/repos/asf/tiles/framework/trunk@1215010 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/patch b/patch
deleted file mode 100644
index ae3e391..0000000
--- a/patch
+++ /dev/null
@@ -1,796 +0,0 @@
-diff --git a/tiles-parent/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java b/tiles-parent/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java
-deleted file mode 100644
-index aebd44e..0000000
---- a/tiles-parent/tiles-core/src/test/java/org/apache/tiles/definition/MockOnlyLocaleTilesContext.java
-+++ /dev/null
-@@ -1,159 +0,0 @@
--/*
-- * $Id$
-- *
-- * Licensed to the Apache Software Foundation (ASF) under one
-- * or more contributor license agreements. See the NOTICE file
-- * distributed with this work for additional information
-- * regarding copyright ownership. The ASF licenses this file
-- * to you 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.apache.tiles.definition;
--
--import java.io.OutputStream;
--import java.io.PrintWriter;
--import java.io.Writer;
--import java.util.Locale;
--import java.util.Map;
--
--import org.apache.tiles.request.ApplicationContext;
--import org.apache.tiles.request.Request;
--
--/**
-- * Creates a TilesApplicationContext that contains only a Locale.
-- *
-- * @version $Rev$ $Date$
-- */
--public class MockOnlyLocaleTilesContext implements Request {
--
-- /**
-- * The locale object.
-- */
-- private Locale locale;
--
-- /** Creates a new instance of MockOnlyLocaleTilesContext.
-- *
-- * @param locale The locale object to use.
-- */
-- public MockOnlyLocaleTilesContext(Locale locale) {
-- this.locale = locale;
-- }
--
-- /**
-- * Returns the locale specified in the constructor.
-- *
-- * @return The locale of the request.
-- * @see org.apache.tiles.request.Request#getRequestLocale()
-- */
-- public Locale getRequestLocale() {
-- return locale;
-- }
--
-- // The rest of the implemented methods has a "dummy" behaviour, doing
-- // nothing or returning null, because they are not needed at all in tests
-- // that use this class.
--
-- /** {@inheritDoc} */
-- public void dispatch(String path) {
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, String> getHeader() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public OutputStream getOutputStream() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public Writer getWriter() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public PrintWriter getPrintWriter() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public boolean isResponseCommitted() {
-- return false;
-- }
--
-- /** {@inheritDoc} */
-- public void setContentType(String contentType) {
-- // Does nothing
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, String[]> getHeaderValues() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, String> getParam() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, String[]> getParamValues() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, Object> getRequestScope() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public Map<String, Object> getSessionScope() {
-- return null;
-- }
--
-- @Override
-- public Map<String, Object> getContext(String scope) {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public ApplicationContext getApplicationContext() {
-- return null;
-- }
--
-- /** {@inheritDoc} */
-- public void include(String path) {
-- }
--
-- /** {@inheritDoc} */
-- public boolean isUserInRole(String role) {
-- return false;
-- }
--
-- /** {@inheritDoc} */
-- public Object[] getRequestObjects() {
-- return null;
-- }
--
-- @Override
-- public String[] getAvailableScopes() {
-- return null;
-- }
--
-- @Override
-- public String[] getNativeScopes() {
-- return null;
-- }
--}
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
-index f8c4917..1f81425 100644
---- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/Request.java
-@@ -27,6 +27,13 @@ public interface Request {
- Map<String, String[]> getHeaderValues();
-
- /**
-+ * Return an unreadable Map that writes headers to the response.
-+ *
-+ * @return The header map.
-+ */
-+ Map<String, String> getResponseHeaders();
-+
-+ /**
- * Returns a context map, given the scope name.
- *
- * @param scope The name of the scope.
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/Addable.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/Addable.java
-new file mode 100644
-index 0000000..5e8b9a9
---- /dev/null
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/Addable.java
-@@ -0,0 +1,38 @@
-+/*
-+ * $Id$
-+ *
-+ * Licensed to the Apache Software Foundation (ASF) under one
-+ * or more contributor license agreements. See the NOTICE file
-+ * distributed with this work for additional information
-+ * regarding copyright ownership. The ASF licenses this file
-+ * to you 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.apache.tiles.request.attribute;
-+
-+/**
-+ * Allows to get and set attributes.
-+ *
-+ * @version $Rev$ $Date$
-+ * @param <V> The type of the value of the attribute.
-+ */
-+public interface Addable<V> {
-+
-+ /**
-+ * Sets a value for the given key.
-+ *
-+ * @param key The key of the attribute.
-+ * @param value The value of the attribute.
-+ */
-+ void setValue(String key, V value);
-+}
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/HasAddableKeys.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/HasAddableKeys.java
-index 16dfcab..115fd2b 100644
---- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/HasAddableKeys.java
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/attribute/HasAddableKeys.java
-@@ -26,13 +26,5 @@ package org.apache.tiles.request.attribute;
- * @version $Rev$ $Date$
- * @param <V> The type of the value of the attribute.
- */
--public interface HasAddableKeys<V> extends HasKeys<V> {
--
-- /**
-- * Sets a value for the given key.
-- *
-- * @param key The key of the attribute.
-- * @param value The value of the attribute.
-- */
-- void setValue(String key, V value);
-+public interface HasAddableKeys<V> extends HasKeys<V>, Addable<V> {
- }
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/collection/AddOnlyMap.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/collection/AddOnlyMap.java
-new file mode 100644
-index 0000000..1670024
---- /dev/null
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/collection/AddOnlyMap.java
-@@ -0,0 +1,188 @@
-+/*
-+ * $Id$
-+ *
-+ * Licensed to the Apache Software Foundation (ASF) under one
-+ * or more contributor license agreements. See the NOTICE file
-+ * distributed with this work for additional information
-+ * regarding copyright ownership. The ASF licenses this file
-+ * to you 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.apache.tiles.request.collection;
-+
-+import java.util.Collection;
-+import java.util.Collections;
-+import java.util.Iterator;
-+import java.util.Map;
-+import java.util.Set;
-+
-+import org.apache.tiles.request.attribute.Addable;
-+
-+/**
-+ * Exposes an {@link Addable} object as a put-only (no remove, no get) map.
-+ * This map will appear empty to anyone trying to fetch its content.
-+ *
-+ * @version $Rev$ $Date$
-+ * @since 3.0.0
-+ */
-+public class AddOnlyMap<V> implements Map<String, V> {
-+ /** The request. */
-+ private Addable<V> request;
-+
-+ /**
-+ * Constructor.
-+ *
-+ * @param request
-+ * The request object to use.
-+ */
-+ public AddOnlyMap(Addable<V> request) {
-+ this.request = request;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public int size() {
-+ return 0;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public boolean isEmpty() {
-+ return true;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public boolean containsKey(Object key) {
-+ return false;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public boolean containsValue(Object value) {
-+ return false;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public V get(Object key) {
-+ return null;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public V put(String key, V value) {
-+ request.setValue(key, value);
-+ return null;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public V remove(Object key) {
-+ return null;
-+ }
-+
-+ /** {@inheritDoc} */
-+ public void putAll(Map<? extends String, ? extends V> map) {
-+ for (Map.Entry<? extends String, ? extends V> entry : map.entrySet()) {
-+ request.setValue(entry.getKey(), entry.getValue());
-+ }
-+ }
-+
-+ /** {@inheritDoc} */
-+ public void clear() {
-+ }
-+
-+ /** {@inheritDoc} */
-+ public Set<String> keySet() {
-+ return Collections.<String> emptySet();
-+ }
-+
-+ /** {@inheritDoc} */
-+ public Collection<V> values() {
-+ return Collections.<V> emptySet();
-+ }
-+
-+ /** {@inheritDoc} */
-+ public Set<java.util.Map.Entry<String, V>> entrySet() {
-+ return new AddOnlyEntrySet();
-+ }
-+
-+ /**
-+ * Entry set implementation for {@link AddableParameterMap}.
-+ */
-+ private class AddOnlyEntrySet implements Set<Map.Entry<String, V>> {
-+
-+ @Override
-+ public boolean add(java.util.Map.Entry<String, V> e) {
-+ request.setValue(e.getKey(), e.getValue());
-+ return true;
-+ }
-+
-+ @Override
-+ public boolean addAll(
-+ Collection<? extends java.util.Map.Entry<String, V>> c) {
-+ for (Map.Entry<String, V> entry : c) {
-+ request.setValue(entry.getKey(), entry.getValue());
-+ }
-+ return true;
-+ }
-+
-+ @Override
-+ public int size() {
-+ return 0;
-+ }
-+
-+ @Override
-+ public boolean isEmpty() {
-+ return false;
-+ }
-+
-+ @Override
-+ public boolean contains(Object o) {
-+ return false;
-+ }
-+
-+ @Override
-+ public Iterator<java.util.Map.Entry<String, V>> iterator() {
-+ return Collections.<java.util.Map.Entry<String, V>>emptySet().iterator();
-+ }
-+
-+ @Override
-+ public Object[] toArray() {
-+ return new java.util.Map.Entry[0];
-+ }
-+
-+ @Override
-+ public <T> T[] toArray(T[] a) {
-+ return Collections.<java.util.Map.Entry<String, V>>emptySet().toArray(a);
-+ }
-+
-+ @Override
-+ public boolean remove(Object o) {
-+ return false;
-+ }
-+
-+ @Override
-+ public boolean containsAll(Collection<?> c) {
-+ return false;
-+ }
-+
-+ @Override
-+ public boolean retainAll(Collection<?> c) {
-+ return false;
-+ }
-+
-+ @Override
-+ public boolean removeAll(Collection<?> c) {
-+ return false;
-+ }
-+
-+ @Override
-+ public void clear() {
-+ }
-+ }
-+}
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/DefaultRequestWrapper.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/DefaultRequestWrapper.java
-index d18f0a4..3ea1b5b 100644
---- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/DefaultRequestWrapper.java
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/DefaultRequestWrapper.java
-@@ -70,6 +70,10 @@ public class DefaultRequestWrapper implements RequestWrapper {
- return context.getHeaderValues();
- }
-
-+ /** {@inheritDoc} */
-+ public Map<String, String> getResponseHeaders() {
-+ return context.getResponseHeaders();
-+ }
-
- /** {@inheritDoc} */
- public ApplicationContext getApplicationContext() {
-diff --git a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/WebRequestWrapper.java b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/WebRequestWrapper.java
-index e266261..fef8496 100644
---- a/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/WebRequestWrapper.java
-+++ b/tiles-request/tiles-request-api/src/main/java/org/apache/tiles/request/util/WebRequestWrapper.java
-@@ -71,6 +71,11 @@ public class WebRequestWrapper extends AbstractRequest implements RequestWrapper
- }
-
- /** {@inheritDoc} */
-+ public Map<String, String> getResponseHeaders() {
-+ return context.getResponseHeaders();
-+ }
-+
-+ /** {@inheritDoc} */
- public Map<String, Object> getContext(String scope) {
- ContextResolver resolver = ApplicationAccess.getContextResolver(context.getApplicationContext());
- return resolver.getContext(this, scope);
-diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/collection/AddOnlyMapTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/collection/AddOnlyMapTest.java
-new file mode 100644
-index 0000000..dc0a7e9
---- /dev/null
-+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/collection/AddOnlyMapTest.java
-@@ -0,0 +1,113 @@
-+/*
-+ * $Id$
-+ *
-+ * Licensed to the Apache Software Foundation (ASF) under one
-+ * or more contributor license agreements. See the NOTICE file
-+ * distributed with this work for additional information
-+ * regarding copyright ownership. The ASF licenses this file
-+ * to you 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.apache.tiles.request.collection;
-+
-+import static org.easymock.EasyMock.*;
-+import static org.easymock.classextension.EasyMock.*;
-+import static org.junit.Assert.*;
-+
-+import java.util.ArrayList;
-+import java.util.HashMap;
-+import java.util.List;
-+import java.util.Map;
-+import java.util.Set;
-+
-+import org.apache.tiles.request.attribute.Addable;
-+import org.junit.Before;
-+import org.junit.Test;
-+
-+/**
-+ * Tests {@link AddOnlyMap}.
-+ *
-+ * @version $Rev$ $Date$
-+ */
-+public class AddOnlyMapTest {
-+
-+ /**
-+ * The object to test.
-+ */
-+ private AddOnlyMap<Integer> map;
-+
-+ /**
-+ * The extractor to use.
-+ */
-+ private Addable<Integer> extractor;
-+
-+ /**
-+ * Sets up the test.
-+ */
-+ @SuppressWarnings("unchecked")
-+ @Before
-+ public void setUp() {
-+ extractor = createMock(Addable.class);
-+ map = new AddOnlyMap<Integer>(extractor);
-+ }
-+
-+ /**
-+ * Test method for {@link org.apache.tiles.request.collection.AddableParameterMap#entrySet()}.
-+ */
-+ @Test
-+ public void testEntrySet() {
-+ Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
-+ MapEntry<String, Integer> entry1 = new MapEntry<String, Integer>("one", 13, false);
-+ MapEntry<String, Integer> entry2 = new MapEntry<String, Integer>("two", 42, false);
-+ List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(2);
-+ entries.add(entry1);
-+ entries.add(entry2);
-+
-+ extractor.setValue("one", 13);
-+ expectLastCall().times(2);
-+ extractor.setValue("two", 42);
-+ replay(extractor);
-+ entrySet.add(entry1);
-+ entrySet.addAll(entries);
-+ verify(extractor);
-+ }
-+
-+ /**
-+ * Test method for {@link AddableParameterMap#put(String, String)}.
-+ */
-+ @Test
-+ public void testPut() {
-+ extractor.setValue("one", 42);
-+
-+ replay(extractor);
-+ assertNull(map.put("one", 42));
-+ verify(extractor);
-+ }
-+
-+ /**
-+ * Test method for {@link org.apache.tiles.request.collection.AddableParameterMap#putAll(java.util.Map)}.
-+ */
-+ @Test
-+ public void testPutAll() {
-+ Map<String, Integer> map = new HashMap<String, Integer>();
-+ map.put("one", 13);
-+ map.put("two", 42);
-+
-+ extractor.setValue("one", 13);
-+ extractor.setValue("two", 42);
-+
-+ replay(extractor);
-+ this.map.putAll(map);
-+ verify(extractor);
-+ }
-+}
-diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java
-index ccffed1..12c801b 100644
---- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java
-+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/scope/ReflectionContextResolverTest.java
-@@ -260,6 +260,11 @@ public class ReflectionContextResolverTest {
- }
-
- @Override
-+ public Map<String, String> getResponseHeaders() {
-+ return null;
-+ }
-+
-+ @Override
- public OutputStream getOutputStream() {
- return null;
- }
-diff --git a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/util/DefaultRequestWrapperTest.java b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/util/DefaultRequestWrapperTest.java
-index 89722f5..71f996c 100644
---- a/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/util/DefaultRequestWrapperTest.java
-+++ b/tiles-request/tiles-request-api/src/test/java/org/apache/tiles/request/util/DefaultRequestWrapperTest.java
-@@ -64,6 +64,23 @@ public class DefaultRequestWrapperTest {
- }
-
- /**
-+ * Test method for {@link org.apache.tiles.request.util.DefaultRequestWrapper#getResponseHeaders()}.
-+ */
-+ @SuppressWarnings("unchecked")
-+ @Test
-+ public void testGetResponseHeaders() {
-+ Request wrappedRequest = createMockRequest();
-+ Map<String, String> header = createMock(Map.class);
-+
-+ expect(wrappedRequest.getResponseHeaders()).andReturn(header);
-+
-+ replay(wrappedRequest);
-+ RequestWrapper request = createRequestWrapper(wrappedRequest);
-+ assertEquals(header, request.getResponseHeaders());
-+ verify(wrappedRequest);
-+ }
-+
-+ /**
- * Test method for {@link org.apache.tiles.request.util.DefaultRequestWrapper#getHeaderValues()}.
- */
- @SuppressWarnings("unchecked")
-diff --git a/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java b/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
-index 0e1eb9d..68a1305 100644
---- a/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
-+++ b/tiles-request/tiles-request-portlet/src/main/java/org/apache/tiles/request/portlet/PortletRequest.java
-@@ -35,8 +35,9 @@ import javax.portlet.PortletSession;
-
- import org.apache.tiles.request.AbstractClientRequest;
- import org.apache.tiles.request.ApplicationContext;
--import org.apache.tiles.request.collection.AddableParameterMap;
-+import org.apache.tiles.request.collection.AddOnlyMap;
- import org.apache.tiles.request.collection.HeaderValuesMap;
-+import org.apache.tiles.request.collection.ReadOnlyEnumerationMap;
- import org.apache.tiles.request.collection.ScopeMap;
- import org.apache.tiles.request.portlet.delegate.RequestDelegate;
- import org.apache.tiles.request.portlet.delegate.ResponseDelegate;
-@@ -64,6 +65,13 @@ public class PortletRequest extends AbstractClientRequest {
-
-
- /**
-+ * <p>The lazily instantiated <code>Map</code> of header name-value
-+ * combinations (write-only).</p>
-+ */
-+ private Map<String, String> responseHeaders = null;
-+
-+
-+ /**
- * <p>The lazily instantitated <code>Map</code> of header name-values
- * combinations (immutable).</p>
- */
-@@ -170,12 +178,20 @@ public class PortletRequest extends AbstractClientRequest {
- /** {@inheritDoc} */
- public Map<String, String> getHeader() {
- if ((header == null) && (request != null)) {
-- header = new AddableParameterMap(new HeaderExtractor(request, response));
-+ header = new ReadOnlyEnumerationMap<String>(new HeaderExtractor(request, null));
- }
- return (header);
- }
-
- /** {@inheritDoc} */
-+ public Map<String, String> getResponseHeaders() {
-+ if ((responseHeaders == null) && (request != null)) {
-+ responseHeaders = new AddOnlyMap<String>(new HeaderExtractor(null, response));
-+ }
-+ return (responseHeaders);
-+ }
-+
-+ /** {@inheritDoc} */
- public Map<String, String[]> getHeaderValues() {
- if ((headerValues == null) && (request != null)) {
- headerValues = new HeaderValuesMap(new HeaderExtractor(request, response));
-diff --git a/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java b/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
-index 293eeab..aada7fc 100644
---- a/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
-+++ b/tiles-request/tiles-request-portlet/src/test/java/org/apache/tiles/request/portlet/PortletRequestTest.java
-@@ -36,8 +36,10 @@ import javax.portlet.PortletResponse;
- import javax.servlet.ServletOutputStream;
-
- import org.apache.tiles.request.ApplicationContext;
-+import org.apache.tiles.request.collection.AddOnlyMap;
- import org.apache.tiles.request.collection.AddableParameterMap;
- import org.apache.tiles.request.collection.HeaderValuesMap;
-+import org.apache.tiles.request.collection.ReadOnlyEnumerationMap;
- import org.apache.tiles.request.collection.ScopeMap;
- import org.apache.tiles.request.portlet.delegate.RequestDelegate;
- import org.apache.tiles.request.portlet.delegate.ResponseDelegate;
-@@ -235,7 +237,15 @@ public class PortletRequestTest {
- */
- @Test
- public void testGetHeader() {
-- assertTrue(req.getHeader() instanceof AddableParameterMap);
-+ assertTrue(req.getHeader() instanceof ReadOnlyEnumerationMap);
-+ }
-+
-+ /**
-+ * Test method for {@link org.apache.tiles.request.portlet.PortletRequest#getResponseHeaders()}.
-+ */
-+ @Test
-+ public void testGetResponseHeaders() {
-+ assertTrue(req.getResponseHeaders() instanceof AddOnlyMap);
- }
-
- /**
-diff --git a/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java b/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
-index dd08938..97824ca 100644
---- a/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
-+++ b/tiles-request/tiles-request-servlet/src/main/java/org/apache/tiles/request/servlet/ServletRequest.java
-@@ -34,7 +34,7 @@ import javax.servlet.http.HttpServletResponse;
-
- import org.apache.tiles.request.AbstractClientRequest;
- import org.apache.tiles.request.ApplicationContext;
--import org.apache.tiles.request.collection.AddableParameterMap;
-+import org.apache.tiles.request.collection.AddOnlyMap;
- import org.apache.tiles.request.collection.HeaderValuesMap;
- import org.apache.tiles.request.collection.ReadOnlyEnumerationMap;
- import org.apache.tiles.request.collection.ScopeMap;
-@@ -81,6 +81,12 @@ public class ServletRequest extends AbstractClientRequest {
- */
- private Map<String, String> header = null;
-
-+ /**
-+ * <p>The lazily instantiated <code>Map</code> of header name-value
-+ * combinations (write-only).</p>
-+ */
-+ private Map<String, String> responseHeaders = null;
-+
-
- /**
- * <p>The lazily instantitated <code>Map</code> of header name-values
-@@ -129,13 +135,22 @@ public class ServletRequest extends AbstractClientRequest {
- public Map<String, String> getHeader() {
-
- if ((header == null) && (request != null)) {
-- header = new AddableParameterMap(new HeaderExtractor(request, response));
-+ header = new ReadOnlyEnumerationMap<String>(new HeaderExtractor(request, null));
- }
- return (header);
-
- }
-
-+ /** {@inheritDoc} */
-+ public Map<String, String> getResponseHeaders() {
-+
-+ if ((responseHeaders == null) && (response != null)) {
-+ responseHeaders = new AddOnlyMap<String>(new HeaderExtractor(null, response));
-+ }
-+ return (responseHeaders);
-
-+ }
-+
- /** {@inheritDoc} */
- public Map<String, String[]> getHeaderValues() {
-
-diff --git a/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java b/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
-index e19fbb9..f597d83 100644
---- a/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
-+++ b/tiles-request/tiles-request-servlet/src/test/java/org/apache/tiles/request/servlet/ServletRequestTest.java
-@@ -36,6 +36,7 @@ import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import org.apache.tiles.request.ApplicationContext;
-+import org.apache.tiles.request.collection.AddOnlyMap;
- import org.apache.tiles.request.collection.AddableParameterMap;
- import org.apache.tiles.request.collection.HeaderValuesMap;
- import org.apache.tiles.request.collection.ReadOnlyEnumerationMap;
-@@ -215,7 +216,15 @@ public class ServletRequestTest {
- */
- @Test
- public void testGetHeader() {
-- assertTrue(req.getHeader() instanceof AddableParameterMap);
-+ assertTrue(req.getHeader() instanceof ReadOnlyEnumerationMap);
-+ }
-+
-+ /**
-+ * Test method for {@link org.apache.tiles.request.servlet.ServletRequest#getHeader()}.
-+ */
-+ @Test
-+ public void testGetResponseHeaders() {
-+ assertTrue(req.getResponseHeaders() instanceof AddOnlyMap);
- }
-
- /**