glenrobson / SimpleAnnotationServer

A simple IIIF and Mirador compatible Annotation Server
Apache License 2.0
97 stars 28 forks source link

Search cannot support non-latin characters (java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map). #57

Closed fishfree closed 4 years ago

fishfree commented 4 years ago

I updated an annotation text from English to Chinese in the Mirador frontend, and checked by accessing http://localhost:8888/annotation/ The Chinese characters are saved in the store! See the screenshot below: image

But again when I search with the Chinese characters, nothing found and there are warning info in the console. image image

URI http://localhost:8888/search-api/3320640/search?q=%E5%90%8E%E6%9D%A5
2020-01-08 14:49:49.262:WARN:oejs.ServletHandler:/search-api/3320640/search
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
        at uk.org.llgc.annotation.store.adapters.AbstractRDFStore.search(AbstractRDFStore.java:221)
        at uk.org.llgc.annotation.store.IIIFSearchAPI.doGet(IIIFSearchAPI.java:77)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359)
        at uk.org.llgc.annotation.store.filters.CorsFilter.doFilter(CorsFilter.java:24)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
        at org.eclipse.jetty.server.Server.handle(Server.java:345)
        at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
        at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
        at java.lang.Thread.run(Thread.java:748)

So I tried to re-index the manifest on http://localhost:8888/uploadManifest.html, but 500 error occured: image

HTTP ERROR 500
Problem accessing /manifests. Reason:

    Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (BufferedReader); line: 1, column: 2]
Caused by:
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (BufferedReader); line: 1, column: 2]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:693)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:591)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1902)
    at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:757)
    at com.github.jsonldjava.utils.JsonUtils.fromJsonParser(JsonUtils.java:191)
    at com.github.jsonldjava.utils.JsonUtils.fromReader(JsonUtils.java:173)
    at com.github.jsonldjava.utils.JsonUtils.fromInputStream(JsonUtils.java:154)
    at com.github.jsonldjava.utils.JsonUtils.fromInputStream(JsonUtils.java:111)
    at uk.org.llgc.annotation.store.AnnotationUtils.frameManifest(AnnotationUtils.java:296)
    at uk.org.llgc.annotation.store.adapters.AbstractRDFStore.getManifest(AbstractRDFStore.java:149)
    at uk.org.llgc.annotation.store.adapters.AbstractStoreAdapter.indexManifest(AbstractStoreAdapter.java:232)
    at uk.org.llgc.annotation.store.adapters.AbstractStoreAdapter.indexManifest(AbstractStoreAdapter.java:226)
    at uk.org.llgc.annotation.store.ManifestUpload.doPost(ManifestUpload.java:69)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359)
    at uk.org.llgc.annotation.store.filters.CorsFilter.doFilter(CorsFilter.java:24)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:345)
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:936)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:748)
Powered by Jetty://
glenrobson commented 4 years ago

Found the issue here. It was a search with an annotation that had a tag rather than the character encoding.