diff --git a/src/main/java/jp/sf/fess/Constants.java b/src/main/java/jp/sf/fess/Constants.java index b1b293aa7..e766862f5 100644 --- a/src/main/java/jp/sf/fess/Constants.java +++ b/src/main/java/jp/sf/fess/Constants.java @@ -30,7 +30,7 @@ public class Constants extends CoreLibConstants { public static final int DEFAULT_ADMIN_PAGE_SIZE = 25; - public static final String WEB_API_VERSION = "3"; + public static final String WEB_API_VERSION = "4"; public static final String LOGIN_INFO = "jp.sf.fess.LoginInfo"; diff --git a/src/main/java/jp/sf/fess/api/json/JsonApiManager.java b/src/main/java/jp/sf/fess/api/json/JsonApiManager.java index b0a5f4abf..fb3908e0b 100644 --- a/src/main/java/jp/sf/fess/api/json/JsonApiManager.java +++ b/src/main/java/jp/sf/fess/api/json/JsonApiManager.java @@ -18,6 +18,8 @@ package jp.sf.fess.api.json; import java.io.IOException; import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.Map; @@ -42,6 +44,7 @@ import jp.sf.fess.util.FacetResponse.Field; import jp.sf.fess.util.MoreLikeThisResponse; import jp.sf.fess.util.WebApiUtil; +import org.apache.commons.lang.StringEscapeUtils; import org.seasar.framework.util.StringUtil; import org.seasar.struts.util.RequestUtil; import org.seasar.struts.util.ResponseUtil; @@ -127,15 +130,14 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { final MoreLikeThisResponse moreLikeThisResponse = WebApiUtil .getObject("moreLikeThisResponse"); - buf.append("\"query\":\""); - buf.append(escapeJsonString(query)); - buf.append("\","); - buf.append("\"execTime\":"); + buf.append("\"query\":"); + buf.append(escapeJson(query)); + buf.append(",\"execTime\":"); buf.append(execTime); buf.append(','); if (StringUtil.isNotBlank(queryId)) { buf.append("\"queryId\":"); - buf.append(escapeJsonString(queryId)); + buf.append(escapeJson(queryId)); buf.append(','); } buf.append("\"pageSize\":"); @@ -172,12 +174,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first2 = false; } - buf.append('\"'); - buf.append(escapeJsonString(name)); - buf.append("\":\""); - buf.append(escapeJsonString(entry.getValue() - .toString())); - buf.append('\"'); + buf.append(escapeJson(name)); + buf.append(':'); + buf.append(escapeJson(entry.getValue())); } } buf.append('}'); @@ -196,9 +195,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first1 = false; } - buf.append("{\"name\":\""); - buf.append(escapeJsonString(field.getName())); - buf.append("\",\"result\":["); + buf.append("{\"name\":"); + buf.append(escapeJson(field.getName())); + buf.append(",\"result\":["); boolean first2 = true; for (final Map.Entry entry : field .getValueCountMap().entrySet()) { @@ -207,9 +206,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first2 = false; } - buf.append("{\"value\":\""); - buf.append(escapeJsonString(entry.getKey())); - buf.append("\",\"count\":"); + buf.append("{\"value\":"); + buf.append(escapeJson(entry.getKey())); + buf.append(",\"count\":"); buf.append(entry.getValue()); buf.append('}'); } @@ -230,9 +229,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first1 = false; } - buf.append("{\"value\":\""); - buf.append(escapeJsonString(entry.getKey())); - buf.append("\",\"count\":"); + buf.append("{\"value\":"); + buf.append(escapeJson(entry.getKey())); + buf.append(",\"count\":"); buf.append(entry.getValue()); buf.append('}'); } @@ -250,9 +249,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first = false; } - buf.append("{\"id\":\""); - buf.append(escapeJsonString(mltEntry.getKey())); - buf.append("\",\"result\":["); + buf.append("{\"id\":"); + buf.append(escapeJson(mltEntry.getKey())); + buf.append(",\"result\":["); boolean first1 = true; for (final Map document : mltEntry .getValue()) { @@ -272,12 +271,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first2 = false; } - buf.append('\"'); - buf.append(escapeJsonString(entry.getKey())); - buf.append("\":\""); - buf.append(escapeJsonString(entry.getValue() - .toString())); - buf.append('\"'); + buf.append(escapeJson(entry.getKey())); + buf.append(':'); + buf.append(escapeJson(entry.getValue())); } } buf.append('}'); @@ -321,13 +317,11 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first1 = false; } - buf.append("{\"label\":\""); - buf.append(escapeJsonString(labelMap - .get(Constants.ITEM_LABEL))); - buf.append("\", \"value\":\""); - buf.append(escapeJsonString(labelMap - .get(Constants.ITEM_VALUE))); - buf.append("\"}"); + buf.append("{\"label\":"); + buf.append(escapeJson(labelMap.get(Constants.ITEM_LABEL))); + buf.append(", \"value\":"); + buf.append(escapeJson(labelMap.get(Constants.ITEM_VALUE))); + buf.append('}'); } buf.append(']'); } @@ -387,11 +381,11 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { final SuggestResponseList srList = (SuggestResponseList) entry .getValue(); - buf.append("{\"token\":\""); - buf.append(escapeJsonString(entry.getKey())); - buf.append("\", \"fn\":\""); - buf.append(escapeJsonString(fn)); - buf.append("\", \"startOffset\":"); + buf.append("{\"token\":"); + buf.append(escapeJson(entry.getKey())); + buf.append(", \"fn\":"); + buf.append(escapeJson(fn)); + buf.append(", \"startOffset\":"); buf.append(Integer.toString(srList.getStartOffset())); buf.append(", \"endOffset\":"); buf.append(Integer.toString(srList.getEndOffset())); @@ -406,10 +400,8 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first2 = false; } - buf.append('"'); - buf.append(escapeJsonString(suggester + buf.append(escapeJson(suggester .convertResultString(value))); - buf.append('"'); } buf.append("]}"); } @@ -461,9 +453,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { buf.append(','); } - buf.append("{\"field\":\"") - .append(escapeJsonString(fEntry.getKey())) - .append("\",\"analysis\":["); + buf.append("{\"field\":") + .append(escapeJson(fEntry.getKey())) + .append(",\"analysis\":["); boolean first2 = true; for (final Map.Entry>> aEntry : fEntry .getValue().entrySet()) { @@ -472,9 +464,9 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { buf.append(','); } - buf.append("{\"name\":\"") - .append(escapeJsonString(aEntry.getKey())) - .append("\",\"data\":["); + buf.append("{\"name\":") + .append(escapeJson(aEntry.getKey())) + .append(",\"data\":["); boolean first3 = true; for (final Map dataMap : aEntry .getValue()) { @@ -495,9 +487,7 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { buf.append(','); } - buf.append('\"') - .append(escapeJsonString(key)) - .append("\":") + buf.append(escapeJson(key)).append(':') .append(escapeJson(value)); } } @@ -547,9 +537,7 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } else { first1 = false; } - buf.append("\""); - buf.append(escapeJsonString(word)); - buf.append("\""); + buf.append(escapeJson(word)); } buf.append(']'); } catch (final Exception e) { @@ -615,9 +603,7 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { if (i > 0) { buf.append(','); } - buf.append('"'); - buf.append(docIdList.get(i)); - buf.append('"'); + buf.append(escapeJson(docIdList.get(i))); } buf.append(']'); } @@ -659,9 +645,8 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { if (status == 0) { buf.append(body); } else { - buf.append("\"message\":\""); - buf.append(escapeJsonString(errMsg)); - buf.append('\"'); + buf.append("\"message\":"); + buf.append(escapeJson(errMsg)); } buf.append('}'); buf.append('}'); @@ -678,6 +663,10 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } protected String escapeJson(final Object obj) { + if (obj == null) { + return "null"; + } + final StringBuilder buf = new StringBuilder(255); if (obj instanceof List) { buf.append('['); @@ -708,8 +697,12 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { || obj instanceof Float || obj instanceof Double || obj instanceof Short) { buf.append(obj); - } else if (obj == null) { - buf.append("\"\""); + } else if (obj instanceof Date) { + final SimpleDateFormat sdf = new SimpleDateFormat( + Constants.DATE_FORMAT_ISO_8601_EXTEND); + buf.append('\"') + .append(StringEscapeUtils.escapeXml(sdf.format(obj))) + .append('\"'); } else { buf.append('\"').append(escapeJsonString(obj.toString())) .append('\"'); @@ -718,9 +711,6 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { } protected String escapeJsonString(final String str) { - if (str == null) { - return ""; - } final StringWriter out = new StringWriter(str.length() * 2); int sz; @@ -730,11 +720,14 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { // handle unicode if (ch > 0xfff) { - out.write("\\u" + hex(ch)); + out.write("\\u"); + out.write(hex(ch)); } else if (ch > 0xff) { - out.write("\\u0" + hex(ch)); + out.write("\\u0"); + out.write(hex(ch)); } else if (ch > 0x7f) { - out.write("\\u00" + hex(ch)); + out.write("\\u00"); + out.write(hex(ch)); } else if (ch < 32) { switch (ch) { case '\b': @@ -759,9 +752,11 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager { break; default: if (ch > 0xf) { - out.write("\\u00" + hex(ch)); + out.write("\\u00"); + out.write(hex(ch)); } else { - out.write("\\u000" + hex(ch)); + out.write("\\u000"); + out.write(hex(ch)); } break; } diff --git a/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java b/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java index 72d7dff0f..17efc2b8f 100644 --- a/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java +++ b/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java @@ -17,6 +17,8 @@ package jp.sf.fess.api.xml; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.Map; @@ -118,14 +120,14 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { .getObject("moreLikeThisResponse"); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(query)); + buf.append(escapeXml(query)); buf.append(""); buf.append(""); buf.append(execTime); buf.append(""); if (StringUtil.isNotBlank(queryId)) { buf.append(""); - buf.append(StringEscapeUtils.escapeXml(queryId)); + buf.append(escapeXml(queryId)); buf.append(""); } buf.append(""); @@ -148,13 +150,11 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { final String name = entry.getKey(); if (StringUtil.isNotBlank(name) && entry.getValue() != null && getQueryHelper().isApiResponseField(name)) { - final String tagName = StringUtil.decamelize(name) - .replaceAll("_", "-").toLowerCase(); + final String tagName = convertTagName(name); buf.append('<'); buf.append(tagName); buf.append('>'); - buf.append(StringEscapeUtils.escapeXml(entry.getValue() - .toString())); + buf.append(escapeXml(entry.getValue())); buf.append("'); @@ -169,15 +169,14 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { if (facetResponse.getFieldList() != null) { for (final Field field : facetResponse.getFieldList()) { buf.append(""); for (final Map.Entry entry : field .getValueCountMap().entrySet()) { buf.append(""); - buf.append(StringEscapeUtils.escapeXml(entry - .getKey())); + buf.append(escapeXml(entry.getKey())); buf.append(""); } buf.append(""); @@ -189,9 +188,9 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { for (final Map.Entry entry : facetResponse .getQueryCountMap().entrySet()) { buf.append(""); - buf.append(StringEscapeUtils.escapeXml(entry.getKey())); + buf.append(escapeXml(entry.getKey())); buf.append(""); } buf.append(""); @@ -203,7 +202,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { for (final Map.Entry>> mltEntry : moreLikeThisResponse .entrySet()) { buf.append(""); for (final Map document : mltEntry .getValue()) { @@ -212,14 +211,13 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { .entrySet()) { if (StringUtil.isNotBlank(entry.getKey()) && entry.getValue() != null) { - final String tagName = StringUtil - .decamelize(entry.getKey()) - .replaceAll("_", "-").toLowerCase(); + final String tagName = convertTagName(entry + .getKey()); buf.append('<'); buf.append(tagName); buf.append('>'); - buf.append(StringEscapeUtils.escapeXml(entry - .getValue().toString())); + buf.append(escapeXml(entry.getValue() + .toString())); buf.append("'); @@ -245,6 +243,12 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { writeXmlResponse(status, buf.toString(), errMsg); } + private String convertTagName(final String name) { + final String tagName = StringUtil.decamelize(name).replaceAll("_", "-") + .toLowerCase(); + return tagName; + } + protected void processLabelRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) { int status = 0; @@ -260,12 +264,10 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { for (final Map labelMap : labelTypeItems) { buf.append(""); } @@ -320,30 +322,28 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { if (suggester != null) { buf.append(""); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(entry - .getKey())); + buf.append(escapeXml(entry.getKey())); buf.append(""); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(fn)); + buf.append(escapeXml(fn)); buf.append(""); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(Integer - .toString(srList.getStartOffset()))); + buf.append(escapeXml(Integer.toString(srList + .getStartOffset()))); buf.append(""); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(Integer - .toString(srList.getEndOffset()))); + buf.append(escapeXml(Integer.toString(srList + .getEndOffset()))); buf.append(""); buf.append(""); - buf.append(StringEscapeUtils.escapeXml(Integer - .toString(srList.getNumFound()))); + buf.append(escapeXml(Integer.toString(srList + .getNumFound()))); buf.append(""); buf.append(""); for (final String value : srList) { buf.append(""); - buf.append(StringEscapeUtils - .escapeXml(suggester - .convertResultString(value))); + buf.append(escapeXml(suggester + .convertResultString(value))); buf.append(""); } buf.append(""); @@ -390,13 +390,12 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { .entrySet()) { buf.append(""); + .append(escapeXml(fEntry.getKey())).append("\">"); for (final Map.Entry>> aEntry : fEntry .getValue().entrySet()) { buf.append(""); + .append(escapeXml(aEntry.getKey())) + .append("\">"); for (final Map dataMap : aEntry .getValue()) { buf.append(""); @@ -406,8 +405,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { final Object value = dEntry.getValue(); if (StringUtil.isNotBlank(key) && value != null) { buf.append("") .append(escapeXml(value)) .append(""); @@ -453,7 +451,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { buf.append(body); } else { buf.append(""); - buf.append(StringEscapeUtils.escapeXml(errMsg)); + buf.append(escapeXml(errMsg)); buf.append(""); } buf.append(""); @@ -478,6 +476,10 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager { .append(escapeXml(entry.getValue())).append(""); } buf.append(""); + } else if (obj instanceof Date) { + final SimpleDateFormat sdf = new SimpleDateFormat( + Constants.DATE_FORMAT_ISO_8601_EXTEND); + buf.append(StringEscapeUtils.escapeXml(sdf.format(obj))); } else if (obj != null) { buf.append(StringEscapeUtils.escapeXml(obj.toString())); }