From 7b6c7ce5ebacd035c66320ab9a04471e37cbb3cc Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 4 Jun 2015 19:53:10 +0200
Subject: [PATCH] no-jira: working version with MathAssess

---
 .../fullWebApp/_content/fullwebapplayout.html |  2 +
 .../ims/qti21/manager/QTI21ServiceImpl.java   |  1 -
 .../ims/qti21/restapi/MathWebService.java     | 38 +++++++++++++++++++
 .../AbstractAssessmentComponent.java          |  3 ++
 .../AssessmentItemComponentRenderer.java      | 12 ++++++
 .../AssessmentTestComponentRenderer.java      | 12 ++++++
 .../ui/rendering/AssessmentRenderer.java      |  1 +
 .../olat/restapi/_spring/restApiContext.xml   |  1 +
 .../interactions/mathEntryInteraction.xsl     |  3 ++
 .../resources/rendering-xslt/qti-common.xsl   |  1 +
 .../resources/rendering-xslt/test-item.xsl    |  2 +-
 11 files changed, 74 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/org/olat/ims/qti21/restapi/MathWebService.java

diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
index 3abf9afe4e0..97a8b114770 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
+++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
@@ -49,6 +49,8 @@ function o_start(){
 }
 /* ]]> */
 </script>
+## <script src='http://localhost/cdnjax/MathJax.js?config=MML_HTMLorMML'></script>
+<script src='//cdn.mathjax.org/mathjax/2.1-latest/MathJax.js?config=MML_HTMLorMML'></script>
 <script type="text/javascript" src='$r.staticLink("js/jsMath/easy/load.js")'></script>
 ## jQuery libraries
 <!--[if lt IE 9]>
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index 49a2c08a89b..e79ec405ebd 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -314,7 +314,6 @@ public class QTI21ServiceImpl implements QTI21Service {
 		Document stateDocument = TestSessionStateXmlMarshaller.marshal(testSessionState);
 		File sessionFile = getTestSessionStateFile(candidateEvent);
 		storeStateDocument(stateDocument, sessionFile);
-		System.out.println("Store state: " + sessionFile);
 	}
 
     private File getTestSessionStateFile(CandidateEvent candidateEvent) {
diff --git a/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java
new file mode 100644
index 00000000000..667ec820393
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/restapi/MathWebService.java
@@ -0,0 +1,38 @@
+package org.olat.ims.qti21.restapi;
+
+import java.util.Date;
+import java.util.Map;
+
+import javax.ws.rs.FormParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.SimpleXsltStylesheetCache;
+import uk.ac.ed.ph.jqtiplus.xmlutils.xslt.XsltStylesheetCache;
+import uk.ac.ed.ph.qtiworks.mathassess.XsltStylesheetCacheAdapter;
+import uk.ac.ed.ph.qtiworks.mathassess.glue.AsciiMathHelper;
+
+@Path("math")
+public class MathWebService {
+	
+	private static final CacheControl cc = new CacheControl();
+	static {
+		cc.setMaxAge(-1);
+	}
+	
+	@POST
+    @Path("verifyAsciiMath")
+    @Produces({MediaType.APPLICATION_JSON})
+    public Response verifyAsciiMath(@FormParam("input") String asciiMathInput) {
+  
+    	XsltStylesheetCache stylesheetCache = new SimpleXsltStylesheetCache();
+    	AsciiMathHelper asciiMathHelper = new AsciiMathHelper(new XsltStylesheetCacheAdapter(stylesheetCache));
+        Map<String, String> upConvertedAsciiMathInput = asciiMathHelper.upConvertAsciiMathInput(asciiMathInput);
+        return Response.ok(upConvertedAsciiMathInput).lastModified(new Date()).cacheControl(cc).build();
+    }
+
+}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
index d0ea7c293be..0c61fbc53ef 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AbstractAssessmentComponent.java
@@ -80,6 +80,9 @@ public abstract class AbstractAssessmentComponent extends AbstractComponent {
 
 		JSAndCSSAdder jsa = vr.getJsAndCSSAdder();
 		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/QtiWorksRendering.js");
+		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/AsciiMathInputController.js");
+		jsa.addRequiredStaticJsFile("assessment/rendering/javascript/UpConversionAjaxController.js");
+		
 		jsa.addRequiredStaticJsFile("js/jquery/maphilight/jquery.maphilight.js");
 		jsa.addRequiredStaticJsFile("js/jquery/ui/jquery-ui-1.11.4.custom.dnd.min.js");
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
index 7aa2c08635c..1b18d4cb7fe 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentItemComponentRenderer.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.WebappHelper;
 import org.olat.ims.qti21.UserTestSession;
 import org.olat.ims.qti21.model.CandidateItemEventType;
 import org.olat.ims.qti21.model.jpa.CandidateEvent;
@@ -71,6 +72,17 @@ public class AssessmentItemComponentRenderer extends DefaultComponentRenderer {
 		ItemSessionController itemSessionController = cmp.getItemSessionController();
 		AssessmentItemFormItem item = cmp.getQtiItem();
 		
+		String restapi = WebappHelper.getServletContextPath() + "/restapi/math/verifyAsciiMath";
+		
+		sb.append("<script>/n")
+		  .append("jQuery(function() {\n")
+		  .append(" console.log('Load','").append(restapi).append("');")
+		  .append(" UpConversionAjaxController.setUpConversionServiceUrl('/").append(restapi).append("');\n")
+          .append(" UpConversionAjaxController.setDelay(300);\n")
+		  .append("});")
+		  .append("</script>/n");
+		
+		
 		//if(itemSessionController.getItemSessionState().isEnded()) {
 		//	sb.append("<h1>The End <small>say the renderer</small></h1>");
 		//} else {
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
index 0ede59aa9c4..032c5eef872 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTestComponentRenderer.java
@@ -34,7 +34,9 @@ import org.olat.core.gui.render.Renderer;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.WebappHelper;
 import org.olat.ims.qti21.UserTestSession;
 import org.olat.ims.qti21.model.CandidateTestEventType;
 import org.olat.ims.qti21.model.jpa.CandidateEvent;
@@ -73,6 +75,16 @@ public class AssessmentTestComponentRenderer extends DefaultComponentRenderer {
 		TestSessionController testSessionController = cmp.getTestSessionController();
 		AssessmentTestFormItem item = cmp.getQtiItem();
 		
+		/*
+		String restapi = "/olat/restapi/math/verifyAsciiMath";
+		sb.append("<script>/n")
+		  //.append("jQuery(function() {\n")
+		  .append(" UpConversionAjaxController.setUpConversionServiceUrl('").append(restapi).append("');\n")
+          .append(" UpConversionAjaxController.setDelay(300);\n")
+		  //.append("});")
+		  .append("</script>/n");
+		*/
+		
 		if(testSessionController.getTestSessionState().isEnded()) {
 			sb.append("<h1>The End <small>say the renderer</small></h1>");
 		} else {
diff --git a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
index 971dad59d3b..178d22d8ff0 100644
--- a/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/rendering/AssessmentRenderer.java
@@ -470,6 +470,7 @@ public class AssessmentRenderer {
         xsltParameters.put("qtiWorksVersion", "1.0-SNAPSH0T-OO");
         xsltParameters.put("webappContextPath", "");
         xsltParameters.put("fullWebappContextPath", Settings.createServerURI());
+        xsltParameters.put("olatWebappContextPath", Settings.getServerContextPathURI());
         StringOutput target = new StringOutput();
         StaticMediaDispatcher.renderStaticURI(target, "", true);
         xsltParameters.put("staticContextPath", target.toString());
diff --git a/src/main/java/org/olat/restapi/_spring/restApiContext.xml b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
index fa592e8c355..8682e7d9118 100644
--- a/src/main/java/org/olat/restapi/_spring/restApiContext.xml
+++ b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
@@ -46,6 +46,7 @@
 				<value>org.olat.course.nodes.bc.BCWebService</value>
 				<value>org.olat.course.assessment.restapi.EfficiencyStatementWebService</value>
 				<value>org.olat.course.certificate.restapi.CertificationWebService</value>
+				<value>org.olat.ims.qti21.restapi.MathWebService</value>
 				<value>org.olat.modules.wiki.restapi.WikisWebService</value>
 				<value>org.olat.modules.fo.restapi.ForumImportWebService</value>
 				<value>org.olat.modules.fo.restapi.ForumCourseNodeWebService</value>
diff --git a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
index 7a0cba93eae..42d95c864c0 100644
--- a/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
+++ b/src/main/resources/rendering-xslt/interactions/mathEntryInteraction.xsl
@@ -38,6 +38,9 @@
         </div>
       </div>
       <script type="text/javascript">
+      	UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$olatWebappContextPath"/>/restapi/math/verifyAsciiMath');
+        UpConversionAjaxController.setDelay(300);
+            
         QtiWorksRendering.registerReadyCallback(function() {
           var inputControlId = 'qtiworks_id_mathEntryInput_<xsl:value-of select="@responseIdentifier"/>';
           var messageContainerId = 'qtiworks_id_mathEntryMessages_<xsl:value-of select="@responseIdentifier"/>';
diff --git a/src/main/resources/rendering-xslt/qti-common.xsl b/src/main/resources/rendering-xslt/qti-common.xsl
index 852cb11956d..499df081fb7 100644
--- a/src/main/resources/rendering-xslt/qti-common.xsl
+++ b/src/main/resources/rendering-xslt/qti-common.xsl
@@ -22,6 +22,7 @@ rendering.
   <xsl:param name="webappContextPath" as="xs:string" required="yes"/>
   <xsl:param name="staticContextPath" as="xs:string" required="yes"/>
   <xsl:param name="fullWebappContextPath" as="xs:string" required="yes"/>
+  <xsl:param name="olatWebappContextPath" as="xs:string" required="yes"/>
 
   <!-- QTIWorks version number -->
   <xsl:param name="qtiWorksVersion" as="xs:string" required="yes"/>
diff --git a/src/main/resources/rendering-xslt/test-item.xsl b/src/main/resources/rendering-xslt/test-item.xsl
index 2b4d12a71e7..f49df12d29f 100644
--- a/src/main/resources/rendering-xslt/test-item.xsl
+++ b/src/main/resources/rendering-xslt/test-item.xsl
@@ -96,7 +96,7 @@ NB: This is used both while being presented, and during review.
           <script src="{$webappContextPath}/rendering/javascript/UpConversionAjaxController.js?v={$qtiWorksVersion}"/>
           <script src="{$webappContextPath}/rendering/javascript/AsciiMathInputController.js?v={$qtiWorksVersion}"/>
           <script>
-            UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>/candidate/verifyAsciiMath');
+            UpConversionAjaxController.setUpConversionServiceUrl('<xsl:value-of select="$webappContextPath"/>restapi/math/verifyAsciiMath');
             UpConversionAjaxController.setDelay(300);
           </script>
         </xsl:if>
-- 
GitLab