fix #44 and fix #46

This commit is contained in:
Shinsuke Sugaya 2013-11-16 07:41:35 +09:00
parent 27a4304092
commit 8f997a5319
3 changed files with 111 additions and 114 deletions

View file

@ -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";

View file

@ -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<String, Long> 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<String, Object> 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<String, List<Map<String, Object>>> 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<String, Object> 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;
}

View file

@ -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("<query>");
buf.append(StringEscapeUtils.escapeXml(query));
buf.append(escapeXml(query));
buf.append("</query>");
buf.append("<exec-time>");
buf.append(execTime);
buf.append("</exec-time>");
if (StringUtil.isNotBlank(queryId)) {
buf.append("<query-id>");
buf.append(StringEscapeUtils.escapeXml(queryId));
buf.append(escapeXml(queryId));
buf.append("</query-id>");
}
buf.append("<page-size>");
@ -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("</");
buf.append(tagName);
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("<field name=\"");
buf.append(StringEscapeUtils.escapeXml(field.getName()));
buf.append(escapeXml(field.getName()));
buf.append("\">");
for (final Map.Entry<String, Long> entry : field
.getValueCountMap().entrySet()) {
buf.append("<value count=\"");
buf.append(entry.getValue());
buf.append(escapeXml(entry.getValue()));
buf.append("\">");
buf.append(StringEscapeUtils.escapeXml(entry
.getKey()));
buf.append(escapeXml(entry.getKey()));
buf.append("</value>");
}
buf.append("</field>");
@ -189,9 +188,9 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
for (final Map.Entry<String, Long> entry : facetResponse
.getQueryCountMap().entrySet()) {
buf.append("<value count=\"");
buf.append(entry.getValue());
buf.append(escapeXml(entry.getValue()));
buf.append("\">");
buf.append(StringEscapeUtils.escapeXml(entry.getKey()));
buf.append(escapeXml(entry.getKey()));
buf.append("</value>");
}
buf.append("</query>");
@ -203,7 +202,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
for (final Map.Entry<String, List<Map<String, Object>>> mltEntry : moreLikeThisResponse
.entrySet()) {
buf.append("<result id=\"");
buf.append(StringEscapeUtils.escapeXml(mltEntry.getKey()));
buf.append(escapeXml(mltEntry.getKey()));
buf.append("\">");
for (final Map<String, Object> 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("</");
buf.append(tagName);
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<String, String> labelMap : labelTypeItems) {
buf.append("<label>");
buf.append("<name>");
buf.append(StringEscapeUtils.escapeXml(labelMap
.get(Constants.ITEM_LABEL)));
buf.append(escapeXml(labelMap.get(Constants.ITEM_LABEL)));
buf.append("</name>");
buf.append("<value>");
buf.append(StringEscapeUtils.escapeXml(labelMap
.get(Constants.ITEM_VALUE)));
buf.append(escapeXml(labelMap.get(Constants.ITEM_VALUE)));
buf.append("</value>");
buf.append("</label>");
}
@ -320,30 +322,28 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
if (suggester != null) {
buf.append("<suggest>");
buf.append("<token>");
buf.append(StringEscapeUtils.escapeXml(entry
.getKey()));
buf.append(escapeXml(entry.getKey()));
buf.append("</token>");
buf.append("<fn>");
buf.append(StringEscapeUtils.escapeXml(fn));
buf.append(escapeXml(fn));
buf.append("</fn>");
buf.append("<start-offset>");
buf.append(StringEscapeUtils.escapeXml(Integer
.toString(srList.getStartOffset())));
buf.append(escapeXml(Integer.toString(srList
.getStartOffset())));
buf.append("</start-offset>");
buf.append("<end-offset>");
buf.append(StringEscapeUtils.escapeXml(Integer
.toString(srList.getEndOffset())));
buf.append(escapeXml(Integer.toString(srList
.getEndOffset())));
buf.append("</end-offset>");
buf.append("<num-found>");
buf.append(StringEscapeUtils.escapeXml(Integer
.toString(srList.getNumFound())));
buf.append(escapeXml(Integer.toString(srList
.getNumFound())));
buf.append("</num-found>");
buf.append("<result>");
for (final String value : srList) {
buf.append("<value>");
buf.append(StringEscapeUtils
.escapeXml(suggester
.convertResultString(value)));
buf.append(escapeXml(suggester
.convertResultString(value)));
buf.append("</value>");
}
buf.append("</result>");
@ -390,13 +390,12 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
.entrySet()) {
buf.append("<field name=\"")
.append(StringEscapeUtils.escapeXml(fEntry.getKey()))
.append("\">");
.append(escapeXml(fEntry.getKey())).append("\">");
for (final Map.Entry<String, List<Map<String, Object>>> aEntry : fEntry
.getValue().entrySet()) {
buf.append("<analysis name=\"")
.append(StringEscapeUtils.escapeXml(aEntry
.getKey())).append("\">");
.append(escapeXml(aEntry.getKey()))
.append("\">");
for (final Map<String, Object> dataMap : aEntry
.getValue()) {
buf.append("<token>");
@ -406,8 +405,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
final Object value = dEntry.getValue();
if (StringUtil.isNotBlank(key) && value != null) {
buf.append("<value name=\"")
.append(StringEscapeUtils
.escapeXml(key))
.append(escapeXml(key))
.append("\">")
.append(escapeXml(value))
.append("</value>");
@ -453,7 +451,7 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
buf.append(body);
} else {
buf.append("<message>");
buf.append(StringEscapeUtils.escapeXml(errMsg));
buf.append(escapeXml(errMsg));
buf.append("</message>");
}
buf.append("</response>");
@ -478,6 +476,10 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
.append(escapeXml(entry.getValue())).append("</value>");
}
buf.append("</data>");
} 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()));
}