📄 atutorapiadapterapplet.java
字号:
/* * SCORM-1.2 API-Adapter Java Applet for ATutor * Copyright (c) Matthai Kurian * * Made for ATutor, the same license terms as for ATutor itself apply. * * This Applet handles communication between ATutor and SCORM-1.2 * Sharable Content Objects (SCOs). Most communication is via Liveconnect. * CMI (Computer Managed Instruction) data is sent to ATutor through http POST * to an ATutor server side PHP script. SCORM-1.2 runtime behavior and CMI * datamodel management is done by the PfPLMS SCORM-1.2 API-Adapter Core. */import java.util.Hashtable;import java.util.Enumeration;import java.net.*;import java.io.*;public class ATutorApiAdapterApplet extends java.applet.Applet implements ch.ethz.pfplms.scorm.api.ApiAdapterInterface{ private ch.ethz.pfplms.scorm.api.ApiAdapter core; private Hashtable ATutorScoCmi = new Hashtable(); private String ATutorStudentId; private String ATutorStudentName; private String ATutorScoId; private String ATutorPreparedScoId; private boolean isVerbose = false; public ATutorApiAdapterApplet () { core = new ch.ethz.pfplms.scorm.api.ApiAdapter (); } public final void init () { if (getParameter("verbose") != null) isVerbose = true; ATutorStudentId = getParameter ("student_id"); ATutorStudentName = getParameter ("student_name"); say ("cmi.core.student_id=" +ATutorStudentId); say ("cmi.core.student_name=" +ATutorStudentName); } private final void say (String s) { if (isVerbose) System.out.println (s); } private final static String decode (String es) { String s = es.replace('+', ' '); int l = s.length(); int a = 0; StringBuffer rv = new StringBuffer(l); byte[] b = null; try { int i; while ((i = s.indexOf('%', a)) >= 0) { rv.append(s.substring(a, i)); a = i; while (i+2 < l && s.charAt(i) == '%') i+=3; if (b == null || b.length < (i-a)/3) { b = new byte[((i-a)/3)]; } int x = 0; for (; a < i; a+=3) { b[x++] = (byte) Integer.parseInt( s.substring(a+1, a+3), 16 ); } rv.append(new String(b, 0, x, "utf-8")); } if (a < l) rv.append(s.substring(a)); return rv.toString(); } catch (Exception e) { return ""; } } /* * Methods for ATutor to call via Liveconnect */ public final void ATutorPrepare (String sco_id) { URLConnection po; ATutorScoCmi.clear(); StringBuffer P = new StringBuffer(); P.append ("&sco_id="+sco_id); say ("Retreiving cmi for sco="+sco_id+" from ATutor server"); try { //po = (HttpURLConnection) ( new java.net.URL ( po = (URLConnection) ( new java.net.URL ( getCodeBase().toString() + "read.php" )).openConnection(); po.setRequestProperty ( "Content-Type", "application/x-www-form-urlencoded" ); po.setRequestProperty ( "Content-Length", Integer.toString (P.length()) ); po.setDoOutput (true); po.setUseCaches (false); //po.setRequestMethod ("POST"); po.setAllowUserInteraction (false); OutputStream os = po.getOutputStream(); os.write (P.toString().getBytes()); os.flush (); os.close (); BufferedReader br = new BufferedReader( new InputStreamReader( po.getInputStream () ) ); String s, l, r; while ((s=br.readLine())!=null) { if (s.indexOf('=') == -1) continue; l = s.substring (0, s.indexOf('=')); r = s.substring (s.indexOf('=')+1, s.length()); r = decode (r); say (" "+l + "="+r); ATutorScoCmi.put (l,r); } } catch (Exception e) { say ("ATutor cmi retrieval failed."); say (e.toString()); } ATutorPreparedScoId = sco_id; say ("Done. Note: this was cmi for the next sco ("+sco_id+") to launch."); } public final void ATutorReset (String s) { if (s != null && s.equals(ATutorScoId)) { ATutorScoId = null; core.reset(); say ("Reset by ATutor client."); } } private final String ATutorCommit (boolean fin) { if (ATutorScoId == null) return "false"; core.transEnd(); StringBuffer P = new StringBuffer(); Hashtable ins = core.getTransNew (); Hashtable mod = core.getTransMod (); if (fin) { Object o = core.sysGet ("cmi.core.entry"); if (o != null && o.toString().equals ("ab-initio")) { mod.put ("cmi.core.entry", ""); } } else { core.transBegin(); } P.append ("&sco_id=" +ATutorScoId); int i=0; for (Enumeration e = ins.keys(); e.hasMoreElements(); i++) { Object l = e.nextElement(); Object r = ins.get(l); P.append("&iL["+i+"]="+l.toString()); P.append("&iR["+i+"]="+URLEncoder.encode(r.toString())); } int u=0; for (Enumeration e = mod.keys(); e.hasMoreElements(); u++) { Object l = e.nextElement(); Object r = mod.get(l); P.append("&uL["+u+"]="+l.toString()); P.append("&uR["+u+"]="+URLEncoder.encode(r.toString())); } if (i == 0 && u == 0) { say ("Nothing to commit."); return "true"; } //HttpURLConnection po; URLConnection po; try { //po = (HttpURLConnection) ( new java.net.URL ( po = (URLConnection) ( new java.net.URL ( getCodeBase().toString() + "write.php" )).openConnection(); po.setRequestProperty ( "Content-Type", "application/x-www-form-urlencoded" ); po.setRequestProperty ( "Content-Length", Integer.toString (P.length()) ); po.setDoOutput (true); po.setUseCaches (false); //po.setRequestMethod ("POST"); po.setAllowUserInteraction (false); OutputStream os = po.getOutputStream(); os.write (P.toString().getBytes()); os.flush (); os.close (); BufferedReader r = new BufferedReader( new InputStreamReader( po.getInputStream () ) ); try { String s; while ((s=r.readLine())!=null) { say(s); } } catch (EOFException ok) {} return "true"; } catch (Exception e) { say ("ATutor cmi storage failed."); say (e.toString()); return "false"; } } public final String ATutorGetValue (String l) { String rv = core.LMSGetValue (l); say ("ATutorGetValue("+l+")="+rv); return rv; } /* * Liveconnect interface methods for SCO */ public final String LMSInitialize (String s) { String rv = core.LMSInitialize(s); say ("LMSInitialize("+s+")="+rv); if (rv.equals("false")) return rv; core.reset(); rv = core.LMSInitialize(s); ATutorScoId = ATutorPreparedScoId; core.sysPut ("cmi.core.student_id", ATutorStudentId); core.sysPut ("cmi.core.student_name", ATutorStudentName); core.sysPut (ATutorScoCmi); core.transBegin(); return rv; } public final String LMSCommit (String s) { String rv = core.LMSCommit(s); if (rv.equals("false")) return rv; rv = ATutorCommit(false); say ("LMSCommit("+s+")="+rv); return rv; } public final String LMSFinish (String s) { String rv = core.LMSFinish(s); say ("LMSFinish("+s+")="+rv); if (rv.equals("false")) return rv; rv = ATutorCommit(true); ATutorScoId = null; core.reset(); return rv; } public final String LMSGetDiagnostic (String e) { String rv = core.LMSGetDiagnostic (e); say ("LMSGetDiagnostic("+e+")="+rv); return rv; } public final String LMSGetErrorString (String e) { String rv = core.LMSGetErrorString (e); say ("LMSGetErrorString("+e+")="+rv); return rv; } public final String LMSGetLastError () { String rv = core.LMSGetLastError (); say ("LMSLastError()="+rv); return rv; } public final String LMSGetValue (String l) { String rv = core.LMSGetValue (l); say ("LMSGetValue("+l+")="+rv); return rv; } public final String LMSSetValue (String l, String r) { String rv = core.LMSSetValue (l, r); say ("LMSSetValue("+l+"="+r+")="+rv); return rv; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -