You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by sa...@apache.org on 2010/07/14 13:52:44 UTC
svn commit: r964015 - in /click/trunk/click/framework:
src/org/apache/click/ClickServlet.java src/org/apache/click/Page.java
test/org/apache/click/PageTest.java
test/org/apache/click/pages/HeaderTestPage.java test/web/header-test.htm
Author: sabob
Date: Wed Jul 14 11:52:43 2010
New Revision: 964015
URL: http://svn.apache.org/viewvc?rev=964015&view=rev
Log:
Improved page header support allowing headers to be set from page constructor. CLK-711
Added:
click/trunk/click/framework/test/org/apache/click/pages/HeaderTestPage.java
click/trunk/click/framework/test/web/header-test.htm
Modified:
click/trunk/click/framework/src/org/apache/click/ClickServlet.java
click/trunk/click/framework/src/org/apache/click/Page.java
click/trunk/click/framework/test/org/apache/click/PageTest.java
Modified: click/trunk/click/framework/src/org/apache/click/ClickServlet.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/ClickServlet.java?rev=964015&r1=964014&r2=964015&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/ClickServlet.java (original)
+++ click/trunk/click/framework/src/org/apache/click/ClickServlet.java Wed Jul 14 11:52:43 2010
@@ -57,6 +57,7 @@ import org.apache.click.util.HtmlStringB
import org.apache.click.util.PageImports;
import org.apache.click.util.PropertyUtils;
import org.apache.click.util.RequestTypeConverter;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.ClassUtils;
import org.apache.commons.lang.StringUtils;
@@ -941,7 +942,7 @@ public class ClickServlet extends HttpSe
Writer writer = getWriter(response);
- if (page.getHeaders() != null) {
+ if (page.hasHeaders()) {
setPageResponseHeaders(response, page.getHeaders());
}
@@ -1264,8 +1265,19 @@ public class ClickServlet extends HttpSe
activatePageInstance(newPage);
- if (newPage.getHeaders() == null) {
- newPage.setHeaders(configService.getPageHeaders(path));
+ Map<String, Object> defaultHeaders = configService.getPageHeaders(path);
+ if (newPage.hasHeaders()) {
+
+ // Don't override existing headers
+ Map pageHeaders = newPage.getHeaders();
+ for (Map.Entry entry : defaultHeaders.entrySet()) {
+ if (!pageHeaders.containsKey(entry.getKey())) {
+ pageHeaders.put(entry.getKey(), entry.getValue());
+ }
+ }
+
+ } else {
+ newPage.getHeaders().putAll(defaultHeaders);
}
newPage.setPath(path);
@@ -1497,9 +1509,13 @@ public class ClickServlet extends HttpSe
long time = ((Date) value).getTime();
response.setDateHeader(name, time);
- } else {
+ } else if (value instanceof Integer) {
int intValue = (Integer) value;
response.setIntHeader(name, intValue);
+
+ } else if (value != null) {
+ throw new IllegalStateException("Invalid Page header value type: "
+ + value.getClass() + ". Header value must of type String, Date or Integer.");
}
}
}
Modified: click/trunk/click/framework/src/org/apache/click/Page.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/src/org/apache/click/Page.java?rev=964015&r1=964014&r2=964015&view=diff
==============================================================================
--- click/trunk/click/framework/src/org/apache/click/Page.java (original)
+++ click/trunk/click/framework/src/org/apache/click/Page.java Wed Jul 14 11:52:43 2010
@@ -174,9 +174,6 @@ public class Page implements Serializabl
/** The HTTP response headers. */
protected Map<String, Object> headers;
- /** The headers have been edited flag, to support copy on write. */
- protected boolean headersEdited;
-
/** The map of localized page resource messages. **/
protected transient Map<String, String> messages;
@@ -594,32 +591,38 @@ public class Page implements Serializabl
/**
* Return the map of HTTP header to be set in the HttpServletResponse.
- * Note to edit header values use {@link #setHeader(String, Object)} as
- * headers Map is initially unmodifiable.
*
* @return the map of HTTP header to be set in the HttpServletResponse
*/
public Map<String, Object> getHeaders() {
+ if (headers == null) {
+ headers = new HashMap<String, Object>();
+ }
return headers;
}
/**
- * Set the named header with the given value. This method uses copy on
- * write to the headers Map, as the initial loaded headers Map is
- * unmodifiable.
+ * Return true if the page has headers, false otherwise.
+ *
+ * @return true if the page has headers, false otherwise
+ */
+ public boolean hasHeaders() {
+ return headers != null && !headers.isEmpty();
+ }
+
+ /**
+ * Set the named header with the given value. Value can be either a String,
+ * Date or Integer.
*
* @param name the name of the header
- * @param value the value of the header
+ * @param value the value of the header, either a String, Date or Integer
*/
public void setHeader(String name, Object value) {
if (name == null) {
throw new IllegalArgumentException("Null header name parameter");
}
- if (!headersEdited) {
- headersEdited = true;
- headers = new HashMap<String, Object>(headers);
- }
- headers.put(name, value);
+
+ getHeaders().put(name, value);
}
/**
Modified: click/trunk/click/framework/test/org/apache/click/PageTest.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/test/org/apache/click/PageTest.java?rev=964015&r1=964014&r2=964015&view=diff
==============================================================================
--- click/trunk/click/framework/test/org/apache/click/PageTest.java (original)
+++ click/trunk/click/framework/test/org/apache/click/PageTest.java Wed Jul 14 11:52:43 2010
@@ -20,6 +20,7 @@ package org.apache.click;
import junit.framework.TestCase;
import org.apache.click.control.Form;
+import org.apache.click.pages.HeaderTestPage;
import org.apache.click.pages.JspRedirectPage;
import org.apache.click.pages.RedirectToHtm;
import org.apache.click.pages.RedirectToJsp;
@@ -199,4 +200,42 @@ public class PageTest extends TestCase {
assertSame(child1, page.getControls().get(0));
assertSame(child2, page.getControls().get(1));
}
+
+ /**
+ * Check that headers can be set during page constructor
+ *
+ * CLK-711
+ */
+ public void testSetPageHeaders() {
+ MockContext.initContext();
+
+ HeaderTestPage headerTestPage = new HeaderTestPage();
+ assertEquals(headerTestPage.getHeaders().get(headerTestPage.expiresHeader), headerTestPage.expiresValue);
+ }
+
+ /**
+ * Check that headers can be set during page constructor and that default
+ * headers won't override the explicitly set headers.
+ *
+ * CLK-711
+ */
+ public void testOverrideDefaultHeaders() {
+ MockContainer container = new MockContainer("web");
+ container.start();
+
+ HeaderTestPage headerTestPage = container.testPage(HeaderTestPage.class);
+
+ System.out.println(headerTestPage.getHeaders());
+
+ // Check that 'Expires' header (a default header) has been set by Page
+ // and not been overridden by ClickServlet
+ assertEquals(headerTestPage.getHeaders().get(headerTestPage.expiresHeader), headerTestPage.expiresValue);
+
+ // A Default header. In this test we check that this header is added to the page headers
+ String pragmaHeader = "Pragma";
+ String pragmaValue = "no-cache";
+ assertEquals(headerTestPage.getHeaders().get(pragmaHeader), pragmaValue);
+
+ container.stop();
+ }
}
Added: click/trunk/click/framework/test/org/apache/click/pages/HeaderTestPage.java
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/test/org/apache/click/pages/HeaderTestPage.java?rev=964015&view=auto
==============================================================================
--- click/trunk/click/framework/test/org/apache/click/pages/HeaderTestPage.java (added)
+++ click/trunk/click/framework/test/org/apache/click/pages/HeaderTestPage.java Wed Jul 14 11:52:43 2010
@@ -0,0 +1,32 @@
+/*
+ * 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.click.pages;
+
+import org.apache.click.Page;
+
+public class HeaderTestPage extends Page {
+
+ public String expiresHeader = "Expires";
+
+ public String expiresValue = "custom";
+
+ public HeaderTestPage() {
+ setHeader(expiresHeader, expiresValue);
+ }
+}
Added: click/trunk/click/framework/test/web/header-test.htm
URL: http://svn.apache.org/viewvc/click/trunk/click/framework/test/web/header-test.htm?rev=964015&view=auto
==============================================================================
--- click/trunk/click/framework/test/web/header-test.htm (added)
+++ click/trunk/click/framework/test/web/header-test.htm Wed Jul 14 11:52:43 2010
@@ -0,0 +1,18 @@
+<!--
+ 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.
+-->
\ No newline at end of file