Importing exported assessment containing hyperlink to resources causes exception

Description

When importing an assessment containing a hyperlink to a file in resources which was previously exported and imported an exception is thrown.

I was able to reproduce this bug on 10.x and 11 nightly mysql builds.

Repro. steps:

1) Upload a file to resources.
2) Create a new assessment and add a question.
3) In the question text add a hyperlink to the file in resources.
4) Export the assessment using Content Packaging.
5) Import the zip file. (exportAssessment.zip)
6) Export the copy of the imported assessment, again using content packaging.
7) Import the new zip file (exportAssessment(1).zip)
8) Exception thrown.

Attachments

1

Activity

Show:

Mickey Johnson May 2, 2016 at 11:33 AM

Thanks for the update Neal,

Just to clarify though, the user does not see the stack trace. What I posted in the comment above was from the tomcat log, sorry for any confusion. The user only sees the "Error importing assessment" message depicted in the last image of the .docx I attached.

Neal Caidin May 2, 2016 at 10:43 AM

Sakai Jira review team decided that this is not a blocker because it is more of an edge case and there are best practices either for including the attachment directly, or to use the site copy feature (or these might be considered workarounds). Degraded to critical (it's still very bad for a user ever to experience a stack trace, but with respect to the 11.0 release, there are higher priority issues).

Neal Caidin April 28, 2016 at 1:40 PM

Thanks for reproducing this in Sakai 10. That argues for not making it a blocker, but generally if an exception is thrown to the user it is automatically considered a blocker.

Mickey Johnson April 26, 2016 at 12:37 PM

Stack trace:

2016-04-22 11:12:16,017 WARN ajp-bio-8009-exec-4 org.sakaiproject.tool.assessment.qti.helper.ExtractionHelper - Can't format assessment duration. org.sakaiproject.tool.assessment.qti.exception.Iso8601FormatException: Invalid ISO8601 format:
2016-04-22 11:12:16,207 ERROR ajp-bio-8009-exec-4 org.sakaiproject.tool.assessment.qti.helper.AttachmentHelper - FileNotFoundException:/usr/local/sakai-content/samigo/jsf/upload_tmp/qti_imports/1e92489e-8698-4758-a02c-ddcd93732225/unzip_files/1461348735617/attachment/importtest/Tests_Quizzes/e97737a1-7906-4af5-8806-527c83e1f04f/cat.jpg (No such file or directory)
2016-04-22 11:12:16,208 ERROR ajp-bio-8009-exec-4 org.sakaiproject.tool.assessment.qti.helper.AuthoringHelper - resourceId is null
java.lang.RuntimeException: resourceId is null
at org.sakaiproject.tool.assessment.qti.helper.ExtractionHelper.makeFCKAttachment(ExtractionHelper.java:1322)
at org.sakaiproject.tool.assessment.qti.helper.ExtractionHelper.addTextAndAnswers(ExtractionHelper.java:1909)
at org.sakaiproject.tool.assessment.qti.helper.ExtractionHelper.updateItem(ExtractionHelper.java:1701)
at org.sakaiproject.tool.assessment.qti.helper.AuthoringHelper.createImportedAssessment(AuthoringHelper.java:677)
at org.sakaiproject.tool.assessment.qti.helper.AuthoringHelper.createImportedAssessment(AuthoringHelper.java:505)
at org.sakaiproject.tool.assessment.services.qti.QTIService.createImportedAssessment(QTIService.java:107)
at org.sakaiproject.tool.assessment.ui.bean.qti.XMLImportBean.createImportedAssessment(XMLImportBean.java:402)
at org.sakaiproject.tool.assessment.ui.bean.qti.XMLImportBean.processFile(XMLImportBean.java:291)
at org.sakaiproject.tool.assessment.ui.bean.qti.XMLImportBean.importAssessment(XMLImportBean.java:174)
at org.sakaiproject.tool.assessment.ui.bean.qti.XMLImportBean.importAssessment(XMLImportBean.java:148)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:146)
at javax.faces.component.UIInput.broadcast(UIInput.java:512)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:269)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:363)
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:98)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:110)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:213)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.corejsf.UploadFilter.doFilter(UploadFilter.java:139)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:634)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
at org.sakaiproject.jsf.util.SamigoJsfTool.dispatch(SamigoJsfTool.java:301)
at org.sakaiproject.jsf.util.JsfTool.doPost(JsfTool.java:256)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:511)
at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1487)
at org.sakaiproject.portal.charon.handlers.ToolHandler.doTool(ToolHandler.java:213)
at org.sakaiproject.portal.charon.handlers.ToolHandler.doGet(ToolHandler.java:96)
at org.sakaiproject.portal.charon.handlers.ToolHandler.doPost(ToolHandler.java:73)
at org.sakaiproject.portal.charon.SkinnableCharonPortal.doPost(SkinnableCharonPortal.java:1277)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:695)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

Duplicate

Details

Priority

Affects versions

Components

Assignee

Reporter

Created April 22, 2016 at 1:14 PM
Updated April 17, 2018 at 8:38 AM
Resolved September 19, 2016 at 11:20 AM