Unable to create folder with some UTF-8 characters

Description

If I attempt to create a folder with a 4 byte character, then I get an error of:

org.sakaiproject.portal.api.PortalHandlerException: org.sakaiproject.tool.api.ToolException: java.lang.reflect.InvocationTargetException at org.sakaiproject.portal.charon.SkinnableCharonPortal.doGet(SkinnableCharonPortal.java:857) caused by: org.sakaiproject.tool.api.ToolException: java.lang.reflect.InvocationTargetException at org.sakaiproject.cheftool.ToolServlet.doGet(ToolServlet.java:236) caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) caused by: java.lang.RuntimeException: SqlService.dbWrite failure at org.sakaiproject.db.impl.BasicSqlService.dbWriteCount(BasicSqlService.java:1152) caused by: java.sql.SQLException: Incorrect string value: '\xF0\xA0\x9C\x8E/' for column 'COLLECTION_ID' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1274) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:780) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java:-1) at org.sakaiproject.db.impl.BasicSqlService.dbWriteCount(BasicSqlService.java:1243) at org.sakaiproject.db.impl.BasicSqlService.dbWriteCount(BasicSqlService.java:1152) at org.sakaiproject.db.impl.BasicSqlService.dbWrite(BasicSqlService.java:1137) at org.sakaiproject.db.impl.BasicSqlService.dbWrite(BasicSqlService.java:1066) at org.sakaiproject.util.BaseDbDualSingleStorage.putResource(BaseDbDualSingleStorage.java:665) at org.sakaiproject.content.impl.DbContentService$DbStorage.putCollection(DbContentService.java:1387) at org.sakaiproject.content.impl.BaseContentService.addValidPermittedCollection(BaseContentService.java:2290) at org.sakaiproject.content.impl.BaseContentService.addCollection(BaseContentService.java:2205) at org.sakaiproject.content.impl.BaseContentService.addCollection(BaseContentService.java:2240) at org.sakaiproject.content.cover.ContentHostingService.addCollection(ContentHostingService.java:1087) at org.sakaiproject.content.tool.ResourcesAction.createFolders(ResourcesAction.java:1133) at org.sakaiproject.content.tool.ResourcesAction.finishAction(ResourcesAction.java:8225) at org.sakaiproject.content.tool.ResourcesAction.buildMainPanelContext(ResourcesAction.java:4852) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.sakaiproject.cheftool.VelocityPortletPaneledAction.toolModeDispatch(VelocityPortletPaneledAction.java:401) at org.sakaiproject.cheftool.ToolServlet.doGet(ToolServlet.java:236) at org.sakaiproject.cheftool.VelocityPortletPaneledAction.doGet(VelocityPortletPaneledAction.java:1154) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.sakaiproject.vm.ComponentServlet.service(ComponentServlet.java:56) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:411) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:358) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:513) at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1487) at org.sakaiproject.portal.charon.handlers.ToolHandler.doTool(ToolHandler.java:204) at org.sakaiproject.portal.charon.handlers.ToolHandler.doGet(ToolHandler.java:100) at org.sakaiproject.portal.charon.SkinnableCharonPortal.doGet(SkinnableCharonPortal.java:857) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:460) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:676) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

Attachments

1
  • 28 Mar 2017, 07:12 AM

Activity

Show:

Mark Golbeck September 4, 2024 at 7:11 PM

Since it's been over two years without any further information provided, we're closing this Jira issue for now. If more details become available in the future, we can reopen it. Thank you.

Matthew Buckett March 28, 2017 at 11:03 AM
Edited

yep, I think that's the right way to go too and looking at the code (briefly) the count is just used to present to the user so we could just present the number of direct members to the user instead.

Sam Ottenhoff March 28, 2017 at 10:53 AM

I'd love to get rid of these COUNT ... LIKE queries ....

Matthew Buckett March 28, 2017 at 10:49 AM

One problem with hashing the resource/collection ID that we don't then support the WHERE IN_COLLECTION like '...' queries which are used to calculate how many items are inside each folder.

org.sakaiproject.content.impl.ContentServiceSqlDefault#getNumContentResources2Sql

Matthew Jones March 28, 2017 at 7:39 AM

I think the best short term fix is either to fix the Validator class to work like FormattedText or to change all methods that call validator.escapeResourceName to call something in FormattedText instead. Maybe for 13 roadmap we can make the minimum MySQL version for Sakai to be 5.7.9 and increase all of this?

Won't Fix

Details

Priority

Affects versions

Components

Assignee

Reporter

Labels

Created March 28, 2017 at 7:10 AM
Updated September 4, 2024 at 7:11 PM
Resolved September 4, 2024 at 7:11 PM