Skip to content

Commit

Permalink
CharSequence (previously String & GString only) support to RenderDyna…
Browse files Browse the repository at this point in the history
…micMethod. Added test for GString & StreamCharBuffer .
  • Loading branch information
lhotari committed Jan 23, 2010
1 parent aec2a8f commit b05f087
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 10 deletions.
Expand Up @@ -115,9 +115,9 @@ public Object invoke(Object target, String methodName, Object[] arguments) {

boolean renderView = true;
GroovyObject controller = (GroovyObject) target;
if ((arguments[0] instanceof String) || (arguments[0] instanceof GString)) {
if (arguments[0] instanceof CharSequence) {
setContentType(response, TEXT_HTML, DEFAULT_ENCODING,true);
String text = arguments[0].toString();
CharSequence text = (CharSequence)arguments[0];
renderView = renderText(text, response);
} else if (arguments[0] instanceof Closure) {
setContentType(response, TEXT_HTML, gspEncoding, true);
Expand Down Expand Up @@ -163,11 +163,12 @@ public Object invoke(Object target, String methodName, Object[] arguments) {
} else {
renderView = renderMarkup(callable, response);
}
} else if (arguments[arguments.length - 1] instanceof String) {
String text = (String) arguments[arguments.length - 1];
} else if (arguments[arguments.length - 1] instanceof CharSequence) {
CharSequence text = (CharSequence) arguments[arguments.length - 1];
renderView = renderText(text, out);
} else if (argMap.containsKey(ARGUMENT_TEXT)) {
String text = argMap.get(ARGUMENT_TEXT).toString();
Object textArg = argMap.get(ARGUMENT_TEXT);
CharSequence text = (textArg instanceof CharSequence) ? ((CharSequence)textArg) : textArg.toString();
renderView = renderText(text, out);
} else if (argMap.containsKey(ARGUMENT_VIEW)) {

Expand Down Expand Up @@ -197,7 +198,7 @@ private boolean renderTemplate(Object target, GroovyObject controller, GrailsWeb
String templateName = argMap.get(ARGUMENT_TEMPLATE).toString();
String contextPath = getContextPath(webRequest, argMap);

String var = (String) argMap.get(ARGUMENT_VAR);
String var = String.valueOf(argMap.get(ARGUMENT_VAR));
// get the template uri
String templateUri = webRequest.getAttributes().getTemplateURI(controller, templateName);

Expand Down Expand Up @@ -386,7 +387,7 @@ private boolean renderMarkup(Closure closure, HttpServletResponse response) {
return renderView;
}

private boolean renderText(String text, HttpServletResponse response) {
private boolean renderText(CharSequence text, HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
return renderText(text, writer);
Expand All @@ -396,9 +397,13 @@ private boolean renderText(String text, HttpServletResponse response) {
}
}

private boolean renderText(String text, Writer writer) {
private boolean renderText(CharSequence text, Writer writer) {
try {
writer.write(text);
if(writer instanceof PrintWriter) {
((PrintWriter)writer).print(text);
} else {
writer.write(text.toString());
}
return false;
} catch (IOException e) {
throw new ControllerExecutionException(e.getMessage(), e);
Expand Down
Expand Up @@ -42,12 +42,14 @@ private PrintWriter getDestination() {
} catch (IOException e) {
setError();
}
super.out = destination;
}
return destination;
}

public void updateDestination(DestinationFactory factory) {
destination = null;
super.out = destination;
this.factory = factory;
}

Expand Down
Expand Up @@ -29,6 +29,16 @@ class RenderDynamicMethodTests extends AbstractGrailsControllerTests {
render "text"
}
def renderStreamCharBuffer = {
def writer = new org.codehaus.groovy.grails.web.pages.FastStringWriter()
writer.write("text")
render writer.buffer
}
def renderGString = {
render "${'te' + 'xt'}"
}
def renderTextWithContentType = {
render(text:"<foo>bar</foo>",contentType:"text/xml", encoding:"utf-16")
}
Expand Down Expand Up @@ -77,7 +87,23 @@ class RenderDynamicMethodTests extends AbstractGrailsControllerTests {
assertEquals "text", response.contentAsString
}

void testRenderTextWithContentType() {
void testRenderStreamCharBuffer() {
def testCtrl = ga.getControllerClass("TestController").newInstance()

testCtrl.renderStreamCharBuffer()
assertEquals "text/html;charset=utf-8", response.contentType
assertEquals "text", response.contentAsString
}

void testRenderGString() {
def testCtrl = ga.getControllerClass("TestController").newInstance()

testCtrl.renderGString()
assertEquals "text/html;charset=utf-8", response.contentType
assertEquals "text", response.contentAsString
}

void testRenderTextWithContentType() {
def testCtrl = ga.getControllerClass("TestController").newInstance()

testCtrl.renderTextWithContentType()
Expand Down

0 comments on commit b05f087

Please sign in to comment.