BaseJsonApiManager.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package org.codelibs.fess.api;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.io.StringWriter;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.List;
  8. import java.util.Locale;
  9. import java.util.Map;
  10. import javax.servlet.http.HttpServletResponse;
  11. import org.apache.commons.lang3.StringEscapeUtils;
  12. import org.codelibs.core.CoreLibConstants;
  13. import org.codelibs.core.lang.StringUtil;
  14. import org.codelibs.fess.Constants;
  15. import org.codelibs.fess.exception.InvalidAccessTokenException;
  16. import org.lastaflute.web.util.LaRequestUtil;
  17. import org.lastaflute.web.util.LaResponseUtil;
  18. public abstract class BaseJsonApiManager extends BaseApiManager {
  19. protected void writeJsonResponse(final int status, final String body, final Throwable t) {
  20. if (t == null) {
  21. writeJsonResponse(status, body, (String) null);
  22. return;
  23. }
  24. if (t instanceof InvalidAccessTokenException) {
  25. final InvalidAccessTokenException e = (InvalidAccessTokenException) t;
  26. final HttpServletResponse response = LaResponseUtil.getResponse();
  27. response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  28. response.setHeader("WWW-Authenticate", "Bearer error=\"" + e.getType() + "\"");
  29. }
  30. final StringBuilder sb = new StringBuilder();
  31. if (StringUtil.isBlank(t.getMessage())) {
  32. sb.append(t.getClass().getName());
  33. } else {
  34. sb.append(t.getMessage());
  35. }
  36. final StringWriter sw = new StringWriter();
  37. t.printStackTrace(new PrintWriter(sw));
  38. sb.append(" [ ").append(sw.toString()).append(" ]");
  39. try {
  40. sw.close();
  41. } catch (final IOException ignore) {}
  42. writeJsonResponse(status, body, sb.toString());
  43. }
  44. protected void writeJsonResponse(final int status, final String body, final String errMsg) {
  45. final String callback = LaRequestUtil.getRequest().getParameter("callback");
  46. final boolean isJsonp = StringUtil.isNotBlank(callback);
  47. final StringBuilder buf = new StringBuilder(1000);
  48. if (isJsonp) {
  49. buf.append(escapeCallbackName(callback));
  50. buf.append('(');
  51. }
  52. buf.append("{\"response\":");
  53. buf.append("{\"version\":");
  54. buf.append(Constants.WEB_API_VERSION);
  55. buf.append(',');
  56. buf.append("\"status\":");
  57. buf.append(status);
  58. if (status == 0) {
  59. if (StringUtil.isNotBlank(body)) {
  60. buf.append(',');
  61. buf.append(body);
  62. }
  63. } else {
  64. buf.append(',');
  65. buf.append("\"message\":");
  66. buf.append(escapeJson(errMsg));
  67. }
  68. buf.append('}');
  69. buf.append('}');
  70. if (isJsonp) {
  71. buf.append(')');
  72. }
  73. write(buf.toString(), "text/javascript+json", Constants.UTF_8);
  74. }
  75. protected String escapeCallbackName(final String callbackName) {
  76. return "/**/" + callbackName.replaceAll("[^0-9a-zA-Z_\\$\\.]", StringUtil.EMPTY);
  77. }
  78. protected String escapeJson(final Object obj) {
  79. if (obj == null) {
  80. return "null";
  81. }
  82. final StringBuilder buf = new StringBuilder(255);
  83. if (obj instanceof List<?>) {
  84. buf.append('[');
  85. boolean first = true;
  86. for (final Object child : (List<?>) obj) {
  87. if (first) {
  88. first = false;
  89. } else {
  90. buf.append(',');
  91. }
  92. buf.append(escapeJson(child));
  93. }
  94. buf.append(']');
  95. } else if (obj instanceof Map<?, ?>) {
  96. buf.append('{');
  97. boolean first = true;
  98. for (final Map.Entry<?, ?> entry : ((Map<?, ?>) obj).entrySet()) {
  99. if (first) {
  100. first = false;
  101. } else {
  102. buf.append(',');
  103. }
  104. buf.append(escapeJson(entry.getKey())).append(':').append(escapeJson(entry.getValue()));
  105. }
  106. buf.append('}');
  107. } else if (obj instanceof Number) {
  108. buf.append(obj);
  109. } else if (obj instanceof Date) {
  110. final SimpleDateFormat sdf = new SimpleDateFormat(CoreLibConstants.DATE_FORMAT_ISO_8601_EXTEND, Locale.ROOT);
  111. buf.append('\"').append(StringEscapeUtils.escapeJson(sdf.format(obj))).append('\"');
  112. } else {
  113. buf.append('\"').append(StringEscapeUtils.escapeJson(obj.toString())).append('\"');
  114. }
  115. return buf.toString();
  116. }
  117. }