/hippo/src/main/java/com/googlecode/hdbc/view/AbstractJsonView.java

http://hdbc.googlecode.com/ · Java · 64 lines · 51 code · 11 blank · 2 comment · 6 complexity · 192ab7a64aeb9b3f1aab3611da5f2952 MD5 · raw file

  1. package com.googlecode.hdbc.view;
  2. import java.io.ByteArrayOutputStream;
  3. import java.nio.charset.Charset;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import net.sf.json.JSONArray;
  8. import net.sf.json.JSONObject;
  9. import org.springframework.context.support.MessageSourceAccessor;
  10. import org.springframework.validation.BindingResult;
  11. import org.springframework.validation.Errors;
  12. import org.springframework.validation.FieldError;
  13. import org.springframework.web.servlet.view.AbstractView;
  14. public abstract class AbstractJsonView extends AbstractView {
  15. private String encoding;
  16. public AbstractJsonView(String contentType, String outputEncoding) {
  17. this.setContentType(contentType);
  18. if (Charset.isSupported(outputEncoding)) {
  19. this.encoding = outputEncoding;
  20. } else {
  21. throw new IllegalArgumentException("The encoding, " + outputEncoding +
  22. ", is not supported on this platform");
  23. }
  24. }
  25. @SuppressWarnings("unchecked")
  26. @Override
  27. protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
  28. // IE workaround: write into byte array first.
  29. ByteArrayOutputStream baos = createTemporaryOutputStream();
  30. JSONObject json = buildJsonResponse(model, request, response);
  31. byte[] output = json.toString().getBytes(encoding);
  32. baos.write(output, 0, output.length);
  33. // Flush to HTTP response.
  34. writeToResponse(response, baos);
  35. }
  36. protected abstract JSONObject buildJsonResponse(Map<String, Object> model, HttpServletRequest request,
  37. HttpServletResponse response);
  38. protected JSONArray buildErrorArray(Map<String, Object> model) {
  39. JSONArray errors = new JSONArray();
  40. Errors bindRslt = (BindingResult) model.get("errors");
  41. if (bindRslt != null && bindRslt.hasFieldErrors()) {
  42. MessageSourceAccessor msgSource = getMessageSourceAccessor();
  43. for (Object error : bindRslt.getFieldErrors()) {
  44. FieldError err = (FieldError) error;
  45. JSONObject temp = new JSONObject();
  46. temp.put(err.getField(),
  47. msgSource.getMessage(err.getCode(), err.getArguments()));
  48. errors.add(temp);
  49. }
  50. }
  51. return errors;
  52. }
  53. }