Search in sources :

Example 6 with LMSDataFormBean

use of org.olat.modules.scorm.server.beans.LMSDataFormBean in project openolat by klemens.

the class OLATApiAdapter method launchItem.

/**
 * @param sahs_id
 */
public final void launchItem(String scoId) {
    if (isLaunching) {
        say("SCO " + olatScoId + " is launching.");
        return;
    }
    if (isLaunched && scoId.equals(olatScoId)) {
        say("SCO " + scoId + " is already running.");
        return;
    }
    olatScoCmi.clear();
    say("Launching sahs " + scoId);
    if (isLaunched) {
        say("SCO " + olatScoId + " will be unloaded.");
    } else {
        isLaunching = true;
        olatScoId = scoId;
        // putting all cmi from the olat storage to the local storage
        LMSDataFormBean lmsDataBean = new LMSDataFormBean();
        lmsDataBean.setItemID(scoId);
        lmsDataBean.setLmsAction("get");
        odatahandler = new LMSDataHandler(scormManager, lmsDataBean, scormSettingsHandler);
        LMSResultsBean lmsBean = odatahandler.getResultsBean();
        olatScoCmi.clear();
        String[][] strArr = lmsBean.getCmiStrings();
        String key = "";
        String value = "";
        if (strArr != null) {
            for (int i = 0; i < strArr.length; i++) {
                key = strArr[i][0];
                value = strArr[i][1];
                olatScoCmi.put(key, value);
                logDebug("passing cmi data to api adapter: " + key + ": " + value);
            }
        }
    }
}
Also used : LMSResultsBean(org.olat.modules.scorm.server.beans.LMSResultsBean) LMSDataHandler(org.olat.modules.scorm.server.beans.LMSDataHandler) LMSDataFormBean(org.olat.modules.scorm.server.beans.LMSDataFormBean)

Example 7 with LMSDataFormBean

use of org.olat.modules.scorm.server.beans.LMSDataFormBean in project openolat by klemens.

the class OLATApiAdapter method getPreviousSco.

/**
 * @param recentId
 * @return the previos Sco itemId
 */
public Integer getPreviousSco(String recentId) {
    // TODO:gs make method faster by caching lmsBean, but when to set out of date?
    LMSDataFormBean lmsDataBean = new LMSDataFormBean();
    lmsDataBean.setItemID(recentId);
    lmsDataBean.setLmsAction("get");
    odatahandler = new LMSDataHandler(scormManager, lmsDataBean, scormSettingsHandler);
    LMSResultsBean lmsBean = odatahandler.getResultsBean();
    String[][] pretable = lmsBean.getPreReqTable();
    String previousNavScoId = "-1";
    for (int i = 0; i < pretable.length; i++) {
        if (pretable[i][0].equals(recentId) && (i != 0)) {
            previousNavScoId = pretable[--i][0];
            break;
        }
    }
    return new Integer(previousNavScoId);
}
Also used : LMSResultsBean(org.olat.modules.scorm.server.beans.LMSResultsBean) LMSDataHandler(org.olat.modules.scorm.server.beans.LMSDataHandler) LMSDataFormBean(org.olat.modules.scorm.server.beans.LMSDataFormBean)

Example 8 with LMSDataFormBean

use of org.olat.modules.scorm.server.beans.LMSDataFormBean in project openolat by klemens.

the class OLATApiAdapter method getScormLastAccessedItemId.

/**
 * @return a String that points to the last accessed sco itemId
 */
public String getScormLastAccessedItemId() {
    LMSDataFormBean lmsDataBean = new LMSDataFormBean();
    lmsDataBean.setLmsAction("boot");
    odatahandler = new LMSDataHandler(scormManager, lmsDataBean, scormSettingsHandler);
    LMSResultsBean lmsBean = odatahandler.getResultsBean();
    return lmsBean.getItemID();
}
Also used : LMSResultsBean(org.olat.modules.scorm.server.beans.LMSResultsBean) LMSDataHandler(org.olat.modules.scorm.server.beans.LMSDataHandler) LMSDataFormBean(org.olat.modules.scorm.server.beans.LMSDataFormBean)

Example 9 with LMSDataFormBean

use of org.olat.modules.scorm.server.beans.LMSDataFormBean in project openolat by klemens.

the class OLATApiAdapter method olatCommit.

/**
 * @param isACommit true, if the call comes from a lmscommit, false if it comes from a lmsfinish
 * @return
 */
private final String olatCommit(boolean isACommit) {
    if (olatScoId == null)
        return "false";
    core.transEnd();
    @SuppressWarnings("unchecked") Hashtable<String, String> ins = core.getTransNew();
    @SuppressWarnings("unchecked") Hashtable<String, String> mod = core.getTransMod();
    core.transBegin();
    LMSDataFormBean lmsDataBean = new LMSDataFormBean();
    lmsDataBean.setItemID(olatScoId);
    // TODO:gs pass the dataBean for use, and do not get it a second time
    lmsDataBean.setNextAction("5");
    lmsDataBean.setLmsAction("update");
    Map<String, String> cmiData = new HashMap<String, String>();
    // TODO:gs:c make it possible only to update the changed cmi data.
    if (ins.size() > 0) {
        Set<String> set = ins.keySet();
        for (Iterator<String> it = set.iterator(); it.hasNext(); ) {
            String cmi = it.next();
            olatScoCmi.remove(cmi);
            olatScoCmi.put(cmi, ins.get(cmi));
        }
    }
    if (mod.size() > 0) {
        Set<String> set = mod.keySet();
        for (Iterator<String> it = set.iterator(); it.hasNext(); ) {
            String cmi = it.next();
            olatScoCmi.remove(cmi);
            olatScoCmi.put(cmi, mod.get(cmi));
        }
    }
    cmiData.putAll(olatScoCmi);
    // work around for missing cmi's (needed by reload code, but not used in ilias code)
    if (cmiData.get("cmi.interactions._count") != null && cmiData.get("cmi.interactions._count") != "0") {
        int count = Integer.parseInt(cmiData.get("cmi.interactions._count"));
        for (int i = 0; i < count; i++) {
            // OLAT-4271: check first if cmi.interactions.n.objectives._count exist before putting a default one
            String objectivesCount = cmiData.get("cmi.interactions." + i + ".objectives._count");
            if (!StringHelper.containsNonWhitespace(objectivesCount)) {
                cmiData.put("cmi.interactions." + i + ".objectives._count", "0");
            }
        }
    }
    if (isACommit) {
        String rawScore = cmiData.get(SCORE_IDENT);
        String lessonStatus = cmiData.get(LESSON_STATUS_IDENT);
        if (StringHelper.containsNonWhitespace(rawScore) || StringHelper.containsNonWhitespace(lessonStatus)) {
            // to prevent problems with bad xmlhttprequest timings
            synchronized (this) {
                // o_clusterOK by:fj: instance is spawned by the ScormAPIandDisplayController
                if (StringHelper.containsNonWhitespace(rawScore)) {
                    scoresProp.put(olatScoId, rawScore);
                    OutputStream os = null;
                    try {
                        os = new BufferedOutputStream(new FileOutputStream(scorePropsFile));
                        scoresProp.store(os, null);
                    } catch (IOException e) {
                        throw new OLATRuntimeException(this.getClass(), "could not save scorm-properties-file: " + scorePropsFile.getAbsolutePath(), e);
                    } finally {
                        FileUtils.closeSafely(os);
                    }
                }
                if (StringHelper.containsNonWhitespace(lessonStatus)) {
                    lessonStatusProp.put(olatScoId, lessonStatus);
                    OutputStream os = null;
                    try {
                        os = new BufferedOutputStream(new FileOutputStream(lessonStatusPropsFile));
                        lessonStatusProp.store(os, null);
                    } catch (IOException e) {
                        throw new OLATRuntimeException(this.getClass(), "could not save scorm-properties-file: " + scorePropsFile.getAbsolutePath(), e);
                    } finally {
                        FileUtils.closeSafely(os);
                    }
                }
                // notify
                if (!apiCallbacks.isEmpty()) {
                    for (ScormAPICallback apiCallback : apiCallbacks) {
                        apiCallback.lmsCommit(olatScoId, scoresProp, lessonStatusProp);
                    }
                }
            }
        }
    // <OLATCE-289>
    } else {
        // if "isACommit" is false, this is a lmsFinish and the apiCallback shall save the points an passed information
        if (!apiCallbacks.isEmpty()) {
            String rawScore = cmiData.get(SCORE_IDENT);
            if (rawScore != null && !rawScore.equals("")) {
                scoresProp.put(olatScoId, rawScore);
            }
            String lessonStatus = cmiData.get(LESSON_STATUS_IDENT);
            if (StringHelper.containsNonWhitespace(lessonStatus)) {
                lessonStatusProp.put(olatScoId, lessonStatus);
            }
            for (ScormAPICallback apiCallback : apiCallbacks) {
                apiCallback.lmsFinish(olatScoId, scoresProp, lessonStatusProp);
            }
        }
    // </OLATCE-289>
    }
    try {
        lmsDataBean.setDataAsMap(cmiData);
        odatahandler = new LMSDataHandler(scormManager, lmsDataBean, scormSettingsHandler);
        odatahandler.updateCMIData(olatScoId);
        return "true";
    } catch (Exception e) {
        logError("Error during commit", e);
        return "false";
    }
}
Also used : HashMap(java.util.HashMap) BufferedOutputStream(java.io.BufferedOutputStream) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) LMSDataHandler(org.olat.modules.scorm.server.beans.LMSDataHandler) OLATRuntimeException(org.olat.core.logging.OLATRuntimeException) IOException(java.io.IOException) OLATRuntimeException(org.olat.core.logging.OLATRuntimeException) FileOutputStream(java.io.FileOutputStream) BufferedOutputStream(java.io.BufferedOutputStream) LMSDataFormBean(org.olat.modules.scorm.server.beans.LMSDataFormBean)

Example 10 with LMSDataFormBean

use of org.olat.modules.scorm.server.beans.LMSDataFormBean in project openolat by klemens.

the class OLATApiAdapter method getNextSco.

/**
 * @param recentId
 * @return the next Sco itemId
 */
public Integer getNextSco(String recentId) {
    // TODO:gs make method faster by chaching lmsBean, but when to set out of date?
    LMSDataFormBean lmsDataBean = new LMSDataFormBean();
    lmsDataBean.setItemID(recentId);
    lmsDataBean.setLmsAction("get");
    odatahandler = new LMSDataHandler(scormManager, lmsDataBean, scormSettingsHandler);
    LMSResultsBean lmsBean = odatahandler.getResultsBean();
    String[][] pretable = lmsBean.getPreReqTable();
    String nextNavScoId = "-1";
    for (int i = 0; i < pretable.length; i++) {
        if (pretable[i][0].equals(recentId) && (i != pretable.length - 1)) {
            nextNavScoId = pretable[++i][0];
            break;
        }
    }
    return new Integer(nextNavScoId);
}
Also used : LMSResultsBean(org.olat.modules.scorm.server.beans.LMSResultsBean) LMSDataHandler(org.olat.modules.scorm.server.beans.LMSDataHandler) LMSDataFormBean(org.olat.modules.scorm.server.beans.LMSDataFormBean)

Aggregations

LMSDataFormBean (org.olat.modules.scorm.server.beans.LMSDataFormBean)16 LMSDataHandler (org.olat.modules.scorm.server.beans.LMSDataHandler)16 LMSResultsBean (org.olat.modules.scorm.server.beans.LMSResultsBean)14 HashMap (java.util.HashMap)4 BufferedOutputStream (java.io.BufferedOutputStream)2 FileOutputStream (java.io.FileOutputStream)2 IOException (java.io.IOException)2 OutputStream (java.io.OutputStream)2 OLATRuntimeException (org.olat.core.logging.OLATRuntimeException)2