Author: musachy Date: Mon Jun 11 18:46:27 2007 New Revision: 546352 URL: http://svn.apache.org/viewvc?view=rev&rev=546352 Log: WW-1853 Extend HttpHeaderResult to support HttpServletResponse.sendError()
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/HttpHeaderResult.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/HttpHeaderResultTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/HttpHeaderResult.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/HttpHeaderResult.java?view=diff&rev=546352&r1=546351&r2=546352 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/HttpHeaderResult.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/HttpHeaderResult.java Mon Jun 11 18:46:27 2007 @@ -39,6 +39,7 @@ * <!-- START SNIPPET: description --> * * A custom Result type for setting HTTP headers and status by optionally evaluating against the ValueStack. + * This result can also be used to send and error to the client. * * <!-- END SNIPPET: description --> * <p/> @@ -53,7 +54,10 @@ * <li><b>parse</b> - true by default. If set to false, the headers param will not be parsed for Ognl expressions.</li> * * <li><b>headers</b> - header values.</li> + * + * <li><b>error</b> - the http servlet response error code that should be set on a response.</li> * + * <li><b>errorMessage</b> - error message to be set on response if 'error' is set.</li> * </ul> * * <!-- END SNIPPET: params --> @@ -66,6 +70,11 @@ * <param name="headers.a">a custom header value</param> * <param name="headers.b">another custom header value</param> * </result> + * + * <result name="proxyRequired" type="httpheader"> + * <param name="error">305</param> + * <param name="errorMessage">this action must be accessed through a prozy</param> + * </result> * <!-- END SNIPPET: example --></pre> * */ @@ -80,7 +89,9 @@ private boolean parse = true; private Map<String,String> headers; private int status = -1; - + private int error = -1; + private String errorMessage; + public HttpHeaderResult() { super(); headers = new HashMap<String,String>(); @@ -94,6 +105,26 @@ /** + * Sets the http servlet error code that should be set on the reponse + * + * @param error the Http error code + * @see javax.servlet.http.HttpServletResponse#sendError(int) + */ + public void setError(int error) { + this.error = error; + } + + /** + * Sets the error message that should be set on the reponse + * + * @param errorMessage error message send to the client + * @see javax.servlet.http.HttpServletResponse#sendError(int, String) + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + /** * Returns a Map of all HTTP headers. * * @return a Map of all HTTP headers. @@ -140,14 +171,20 @@ */ public void execute(ActionInvocation invocation) throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); - + ValueStack stack = ActionContext.getContext().getValueStack(); + if (status != -1) { response.setStatus(status); + } else if (error != -1) { + if (errorMessage != null) { + String finalMessage = parse ? TextParseUtil.translateVariables( + errorMessage, stack) : errorMessage; + response.sendError(error, finalMessage); + } else + response.sendError(error); } if (headers != null) { - ValueStack stack = ActionContext.getContext().getValueStack(); - for (Iterator iterator = headers.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/HttpHeaderResultTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/HttpHeaderResultTest.java?view=diff&rev=546352&r1=546351&r2=546352 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/HttpHeaderResultTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/HttpHeaderResultTest.java Mon Jun 11 18:46:27 2007 @@ -81,10 +81,38 @@ result.execute(invocation); responseMock.verify(); } + + public void testErrorMessageIsParsedAndSet() throws Exception { + ActionContext.getContext().getValueStack().set("errMsg", "abc"); + result.setError(404); + result.setErrorMessage("${errMsg}"); + + responseMock.expect("sendError", C.args(C.eq(404), C.eq("abc"))); + result.execute(invocation); + responseMock.verify(); + } + + public void testErrorMessageIsNotParsedAndSet() throws Exception { + ActionContext.getContext().getValueStack().set("errMsg", "abc"); + result.setError(404); + result.setParse(false); + result.setErrorMessage("${errMsg}"); + + responseMock.expect("sendError", C.args(C.eq(404), C.eq("${errMsg}"))); + result.execute(invocation); + responseMock.verify(); + } public void testStatusIsSet() throws Exception { responseMock.expect("setStatus", C.eq(123)); result.setStatus(123); + result.execute(invocation); + responseMock.verify(); + } + + public void testErrorIsSet() throws Exception { + responseMock.expect("sendError", C.eq(404)); + result.setError(404); result.execute(invocation); responseMock.verify(); }