123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /*
- * Copyright 2012-2020 CodeLibs Project and the Others.
- *
- * Licensed 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.codelibs.fess.api;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.List;
- import java.util.Locale;
- import java.util.Map;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.text.StringEscapeUtils;
- import org.codelibs.core.CoreLibConstants;
- import org.codelibs.core.lang.StringUtil;
- import org.codelibs.fess.Constants;
- import org.codelibs.fess.exception.InvalidAccessTokenException;
- import org.codelibs.fess.util.ComponentUtil;
- import org.lastaflute.web.util.LaRequestUtil;
- import org.lastaflute.web.util.LaResponseUtil;
- public abstract class BaseJsonApiManager extends BaseApiManager {
- protected String mimeType = "application/json";
- protected void writeJsonResponse(final int status, final String body, final Throwable t) {
- if (t == null) {
- writeJsonResponse(status, body, (String) null);
- return;
- }
- if (t instanceof InvalidAccessTokenException) {
- final InvalidAccessTokenException e = (InvalidAccessTokenException) t;
- final HttpServletResponse response = LaResponseUtil.getResponse();
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- response.setHeader("WWW-Authenticate", "Bearer error=\"" + e.getType() + "\"");
- }
- final StringBuilder sb = new StringBuilder();
- if (StringUtil.isBlank(t.getMessage())) {
- sb.append(t.getClass().getName());
- } else {
- sb.append(t.getMessage());
- }
- final StringWriter sw = new StringWriter();
- t.printStackTrace(new PrintWriter(sw));
- sb.append(" [ ").append(sw.toString()).append(" ]");
- try {
- sw.close();
- } catch (final IOException ignore) {}
- writeJsonResponse(status, body, sb.toString());
- }
- protected void writeJsonResponse(final int status, final String body, final String errMsg) {
- String content = null;
- if (status == 0) {
- if (StringUtil.isNotBlank(body)) {
- content = body;
- }
- } else {
- content = "\"message\":" + escapeJson(errMsg);
- }
- writeJsonResponse(status, content);
- }
- protected void writeJsonResponse(final int status, final String body) {
- final String callback = LaRequestUtil.getRequest().getParameter("callback");
- final boolean isJsonp = ComponentUtil.getFessConfig().isApiJsonpEnabled() && StringUtil.isNotBlank(callback);
- final StringBuilder buf = new StringBuilder(1000);
- if (isJsonp) {
- buf.append(escapeCallbackName(callback));
- buf.append('(');
- }
- buf.append("{\"response\":");
- buf.append("{\"version\":");
- buf.append(ComponentUtil.getSystemHelper().getProductVersion());
- buf.append(',');
- buf.append("\"status\":");
- buf.append(status);
- if (StringUtil.isNotBlank(body)) {
- buf.append(',');
- buf.append(body);
- }
- buf.append('}');
- buf.append('}');
- if (isJsonp) {
- buf.append(')');
- }
- write(buf.toString(), mimeType, Constants.UTF_8);
- }
- protected String escapeCallbackName(final String callbackName) {
- return "/**/" + callbackName.replaceAll("[^0-9a-zA-Z_\\$\\.]", StringUtil.EMPTY);
- }
- protected String escapeJson(final Object obj) {
- if (obj == null) {
- return "null";
- }
- final StringBuilder buf = new StringBuilder(255);
- if (obj instanceof String[]) {
- buf.append('[');
- boolean first = true;
- for (final Object child : (String[]) obj) {
- if (first) {
- first = false;
- } else {
- buf.append(',');
- }
- buf.append(escapeJson(child));
- }
- buf.append(']');
- } else if (obj instanceof List<?>) {
- buf.append('[');
- boolean first = true;
- for (final Object child : (List<?>) obj) {
- if (first) {
- first = false;
- } else {
- buf.append(',');
- }
- buf.append(escapeJson(child));
- }
- buf.append(']');
- } else if (obj instanceof Map<?, ?>) {
- buf.append('{');
- boolean first = true;
- for (final Map.Entry<?, ?> entry : ((Map<?, ?>) obj).entrySet()) {
- if (first) {
- first = false;
- } else {
- buf.append(',');
- }
- buf.append(escapeJson(entry.getKey())).append(':').append(escapeJson(entry.getValue()));
- }
- buf.append('}');
- } else if (obj instanceof Integer) {
- buf.append((obj));
- } else if (obj instanceof Long) {
- buf.append((obj));
- } else if (obj instanceof Float) {
- buf.append((obj));
- } else if (obj instanceof Double) {
- buf.append((obj));
- } else if (obj instanceof Boolean) {
- buf.append(obj.toString());
- } else if (obj instanceof Date) {
- final SimpleDateFormat sdf = new SimpleDateFormat(CoreLibConstants.DATE_FORMAT_ISO_8601_EXTEND, Locale.ROOT);
- buf.append('\"').append(StringEscapeUtils.escapeJson(sdf.format(obj))).append('\"');
- } else {
- buf.append('\"').append(StringEscapeUtils.escapeJson(obj.toString())).append('\"');
- }
- return buf.toString();
- }
- public void setMimeType(final String mimeType) {
- this.mimeType = mimeType;
- }
- }
|