use of org.olat.ims.qti.process.ImsRepositoryResolver in project OpenOLAT by OpenOLAT.
the class IQRunController method createChangelogMsg.
/**
* @param ureq
* @return
*/
private StringBuilder createChangelogMsg(UserRequest ureq) {
/*
* TODO:pb:is ImsRepositoryResolver the right place for getting the change log?
*/
// re could be null, but if we are here it should not be null!
Roles userRoles = ureq.getUserSession().getRoles();
boolean showAll = userRoles.isAuthor() || userRoles.isOLATAdmin();
// get changelog
Formatter formatter = Formatter.getInstance(ureq.getLocale());
ImsRepositoryResolver resolver = new ImsRepositoryResolver(referenceTestEntry);
QTIChangeLogMessage[] qtiChangeLog = resolver.getDocumentChangeLog();
StringBuilder qtiChangelog = new StringBuilder();
if (qtiChangeLog.length > 0) {
// there are resource changes
Arrays.sort(qtiChangeLog);
for (int i = qtiChangeLog.length - 1; i >= 0; i--) {
// show latest change first
if (!showAll && qtiChangeLog[i].isPublic()) {
// logged in person is a normal user, hence public messages only
Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
qtiChangelog.append(msg);
qtiChangelog.append("\n********************************\n");
} else if (showAll) {
// logged in person is an author, olat admin, owner, show all messages
Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
qtiChangelog.append(msg);
qtiChangelog.append("\n********************************\n");
}
// else non public messages are not shown to normal user
}
}
return qtiChangelog;
}
use of org.olat.ims.qti.process.ImsRepositoryResolver in project openolat by klemens.
the class IQRunController method createChangelogMsg.
/**
* @param ureq
* @return
*/
private StringBuilder createChangelogMsg(UserRequest ureq) {
/*
* TODO:pb:is ImsRepositoryResolver the right place for getting the change log?
*/
// re could be null, but if we are here it should not be null!
Roles userRoles = ureq.getUserSession().getRoles();
boolean showAll = userRoles.isAuthor() || userRoles.isOLATAdmin();
// get changelog
Formatter formatter = Formatter.getInstance(ureq.getLocale());
ImsRepositoryResolver resolver = new ImsRepositoryResolver(referenceTestEntry);
QTIChangeLogMessage[] qtiChangeLog = resolver.getDocumentChangeLog();
StringBuilder qtiChangelog = new StringBuilder();
if (qtiChangeLog.length > 0) {
// there are resource changes
Arrays.sort(qtiChangeLog);
for (int i = qtiChangeLog.length - 1; i >= 0; i--) {
// show latest change first
if (!showAll && qtiChangeLog[i].isPublic()) {
// logged in person is a normal user, hence public messages only
Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
qtiChangelog.append(msg);
qtiChangelog.append("\n********************************\n");
} else if (showAll) {
// logged in person is an author, olat admin, owner, show all messages
Date msgDate = new Date(qtiChangeLog[i].getTimestmp());
qtiChangelog.append("\nChange date: ").append(formatter.formatDateAndTime(msgDate)).append("\n");
String msg = StringHelper.escapeHtml(qtiChangeLog[i].getLogMessage());
qtiChangelog.append(msg);
qtiChangelog.append("\n********************************\n");
}
// else non public messages are not shown to normal user
}
}
return qtiChangelog;
}
use of org.olat.ims.qti.process.ImsRepositoryResolver in project OpenOLAT by OpenOLAT.
the class OnyxModule method isOnyxTest.
public static boolean isOnyxTest(final OLATResourceable res) {
if (res.getResourceableTypeName().equals(TestFileResource.TYPE_NAME) || res.getResourceableTypeName().equals(SurveyFileResource.TYPE_NAME)) {
Long resourceId = res.getResourceableId();
Boolean onyx = onyxMap.get(resourceId);
if (onyx == null) {
onyx = Boolean.FALSE;
try {
final Resolver resolver = new ImsRepositoryResolver(res);
// search for qti.xml, it not exists for qti2
if (resolver.getQTIDocument() == null) {
onyx = Boolean.TRUE;
} else {
onyx = Boolean.FALSE;
}
} catch (OLATRuntimeException e) {
log.error("", e);
}
onyxMap.put(resourceId, onyx);
}
return onyx.booleanValue();
} else {
return false;
}
}
use of org.olat.ims.qti.process.ImsRepositoryResolver in project OpenOLAT by OpenOLAT.
the class IQDisplayController method init.
private void init(IQSecurityCallback secCallback, UserRequest ureq) {
this.iqsec = secCallback;
this.translator = Util.createPackageTranslator(IQDisplayController.class, ureq.getLocale());
this.ready = false;
retrieveListenerOres = new IQRetrievedEvent(ureq.getIdentity(), courseResId, courseNodeIdent);
CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), retrieveListenerOres);
iqm = CoreSpringFactory.getImpl(IQManager.class);
myContent = new VelocityContainer("olatmodiqrun", VELOCITY_ROOT + "/qti.html", translator, this);
// Check if fibautocompl.js and fibautocompl.css exists for enhance FIB autocomplete feature
Resolver autcompResolver = null;
if (resolver == null) {
RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntryBySoftkey(repositorySoftkey, true);
autcompResolver = new ImsRepositoryResolver(re);
} else {
autcompResolver = this.resolver;
}
if (autcompResolver != null && autcompResolver.hasAutocompleteFiles()) {
// Add Autocomplte JS and CSS file to header
StringBuilder sb = new StringBuilder();
// must be like <script type="text/javascript" src="/olat/secstatic/qti/74579818809617/_unzipped_/fibautocompl.js"></script>
sb.append("<script type=\"text/javascript\" src=\"").append(autcompResolver.getStaticsBaseURI()).append("/").append(ImsRepositoryResolver.QTI_FIB_AUTOCOMPLETE_JS_FILE).append("\"></script>\n");
// must be like <link rel="StyleSheet" href="/olat/secstatic/qti/74579818809617/_unzipped_/fibautocompl.css" type="text/css" media="screen, print">
sb.append("<link rel=\"StyleSheet\" href=\"").append(autcompResolver.getStaticsBaseURI()).append("/").append(ImsRepositoryResolver.QTI_FIB_AUTOCOMPLETE_CSS_FILE).append("\" type=\"text/css\" media=\"screen\" >\n");
JSAndCSSComponent autoCompleteJsCss = new JSAndCSSComponent("auto_complete_js_css", this.getClass(), true, sb.toString());
myContent.put("autoCompleteJsCss", autoCompleteJsCss);
}
closeButton = LinkFactory.createButton("close", myContent, this);
closeButton.setPrimary(true);
qtiscoreprogress = new ProgressBar("qtiscoreprogress", 150, 0, 0, "");
myContent.put("qtiscoreprogress", qtiscoreprogress);
Boolean displayScoreProgress = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_SCOREPROGRESS);
// migration,
if (displayScoreProgress == null)
displayScoreProgress = Boolean.TRUE;
// menu
if (!displayScoreProgress.booleanValue())
qtiscoreprogress.setVisible(false);
myContent.contextPut("displayScoreProgress", displayScoreProgress);
qtiquestionprogress = new ProgressBar("qtiquestionprogress", 150, 0, 0, "");
myContent.put("qtiquestionprogress", qtiquestionprogress);
Boolean displayQuestionProgress = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_QUESTIONPROGRESS);
// migration,
if (displayQuestionProgress == null)
displayQuestionProgress = Boolean.FALSE;
if (!displayQuestionProgress.booleanValue())
qtiquestionprogress.setVisible(false);
myContent.contextPut("displayQuestionProgress", displayQuestionProgress);
Boolean displayMenu = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_DISPLAYMENU);
// migration
if (displayMenu == null)
displayMenu = Boolean.TRUE;
myContent.contextPut("displayMenu", displayMenu);
Boolean enableCancel = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLECANCEL);
if (enableCancel == null) {
if (// migration:
modConfig.get(IQEditController.CONFIG_KEY_TYPE).equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS))
// migration:
enableCancel = Boolean.FALSE;
else
// disable
// cancel
// for
// assessments
// migration: enable otherwise
enableCancel = Boolean.TRUE;
}
myContent.contextPut("enableCancel", enableCancel);
Boolean enableSuspend = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLESUSPEND);
// migration
if (enableSuspend == null)
enableSuspend = Boolean.FALSE;
myContent.contextPut("enableSuspend", enableSuspend);
qtistatus = new IQStatus(translator);
qtistatus.setPreview(iqsec.isPreview());
myContent.contextPut("qtistatus", qtistatus);
setInitialComponent(myContent);
// get the assessment
AssessmentInstance ai = null;
if (repositorySoftkey != null) {
// instantiate from repository
// build path information which will be used to store tempory qti file
String resourcePathInfo = courseResId + File.separator + courseNodeIdent;
ai = AssessmentFactory.createAssessmentInstance(ureq.getIdentity(), ureq.getHttpReq().getRemoteAddr(), modConfig, iqsec.isPreview(), courseResId, courseNodeIdent, resourcePathInfo, this);
} else if (resolver != null) {
// instantiate from given resolver
ai = AssessmentFactory.createAssessmentInstance(ureq.getIdentity(), ureq.getHttpReq().getRemoteAddr(), courseResId, courseNodeIdent, resolver, persister, modConfig, this);
}
// check for null instance or instance with no items
if (ai == null || ai.getAssessmentContext().getSectionContext(0).getItemContextCount() == 0)
throw new AssertException("Assessment Instance was null or no sections/items found.");
if (!iqsec.isAllowed(ai)) {
// security check
getWindowControl().setError(translator.translate("status.notallowed"));
return;
}
if (iqsec.attemptsLeft(ai) < 1) {
// security check
// note: important: do not check on == 0 since the nr of attempts can be
// republished for the same test with a smaller number as the latest time.
getWindowControl().setInfo(translator.translate(ai.isSurvey() ? "status.survey.nomoreattempts" : "status.assess.nomoreattempts"));
return;
}
if (ai.isResuming()) {
getWindowControl().setInfo(translator.translate(ai.isSurvey() ? "status.survey.resumed" : "status.assess.resumed"));
}
ai.setPreview(iqsec.isPreview());
/*
* menu render option: render only section titles or titles and questions.
*/
Object tmp = modConfig.get(IQEditController.CONFIG_KEY_RENDERMENUOPTION);
Boolean renderSectionsOnly;
if (tmp == null) {
// migration
modConfig.set(IQEditController.CONFIG_KEY_RENDERMENUOPTION, Boolean.FALSE);
renderSectionsOnly = Boolean.FALSE;
} else {
renderSectionsOnly = (Boolean) tmp;
}
boolean enabledMenu = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLEMENU).booleanValue();
boolean itemPageSequence = ((String) modConfig.get(IQEditController.CONFIG_KEY_SEQUENCE)).equals(AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM);
IQMenuDisplayConf mdc = new IQMenuDisplayConf(renderSectionsOnly.booleanValue(), enabledMenu, itemPageSequence);
Boolean tmpMemo = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_MEMO);
boolean memo = tmpMemo == null ? false : tmpMemo.booleanValue();
qticomp = new IQComponent("qticomponent", translator, ai, mdc, memo);
qticomp.addListener(this);
myContent.put("qticomp", qticomp);
if (!ai.isResuming()) {
Navigator navigator = ai.getNavigator();
navigator.startAssessment();
} else {
// fxdiff BAKS-7 Resume function
AssessmentContext act = ai.getAssessmentContext();
if (act.getCurrentSectionContextPos() >= 0) {
int sectionPos = act.getCurrentSectionContextPos();
OLATResourceable sres = OresHelper.createOLATResourceableInstance("gse", new Long(sectionPos));
WindowControl bwControl = addToHistory(ureq, sres, null, getWindowControl(), false);
if (!ai.isSectionPage()) {
SectionContext sct = act.getCurrentSectionContext();
int itemPos = sct.getCurrentItemContextPos();
if (itemPos >= 0) {
OLATResourceable ires = OresHelper.createOLATResourceableInstance("git", new Long(itemPos));
addToHistory(ureq, ires, null, bwControl, true);
}
}
}
}
qtistatus.update(ai);
if (!qtistatus.isSurvey()) {
qtiscoreprogress.setMax(ai.getAssessmentContext().getMaxScore());
qtiscoreprogress.setActual(ai.getAssessmentContext().getScore());
}
qtiquestionprogress.setMax(Integer.parseInt(qtistatus.getMaxQuestions()));
updateQuestionProgressDisplay(ai);
ready = true;
}
use of org.olat.ims.qti.process.ImsRepositoryResolver in project openolat by klemens.
the class IQDisplayController method init.
private void init(IQSecurityCallback secCallback, UserRequest ureq) {
this.iqsec = secCallback;
this.translator = Util.createPackageTranslator(IQDisplayController.class, ureq.getLocale());
this.ready = false;
retrieveListenerOres = new IQRetrievedEvent(ureq.getIdentity(), courseResId, courseNodeIdent);
CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), retrieveListenerOres);
iqm = CoreSpringFactory.getImpl(IQManager.class);
myContent = new VelocityContainer("olatmodiqrun", VELOCITY_ROOT + "/qti.html", translator, this);
// Check if fibautocompl.js and fibautocompl.css exists for enhance FIB autocomplete feature
Resolver autcompResolver = null;
if (resolver == null) {
RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntryBySoftkey(repositorySoftkey, true);
autcompResolver = new ImsRepositoryResolver(re);
} else {
autcompResolver = this.resolver;
}
if (autcompResolver != null && autcompResolver.hasAutocompleteFiles()) {
// Add Autocomplte JS and CSS file to header
StringBuilder sb = new StringBuilder();
// must be like <script type="text/javascript" src="/olat/secstatic/qti/74579818809617/_unzipped_/fibautocompl.js"></script>
sb.append("<script type=\"text/javascript\" src=\"").append(autcompResolver.getStaticsBaseURI()).append("/").append(ImsRepositoryResolver.QTI_FIB_AUTOCOMPLETE_JS_FILE).append("\"></script>\n");
// must be like <link rel="StyleSheet" href="/olat/secstatic/qti/74579818809617/_unzipped_/fibautocompl.css" type="text/css" media="screen, print">
sb.append("<link rel=\"StyleSheet\" href=\"").append(autcompResolver.getStaticsBaseURI()).append("/").append(ImsRepositoryResolver.QTI_FIB_AUTOCOMPLETE_CSS_FILE).append("\" type=\"text/css\" media=\"screen\" >\n");
JSAndCSSComponent autoCompleteJsCss = new JSAndCSSComponent("auto_complete_js_css", this.getClass(), true, sb.toString());
myContent.put("autoCompleteJsCss", autoCompleteJsCss);
}
closeButton = LinkFactory.createButton("close", myContent, this);
closeButton.setPrimary(true);
qtiscoreprogress = new ProgressBar("qtiscoreprogress", 150, 0, 0, "");
myContent.put("qtiscoreprogress", qtiscoreprogress);
Boolean displayScoreProgress = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_SCOREPROGRESS);
// migration,
if (displayScoreProgress == null)
displayScoreProgress = Boolean.TRUE;
// menu
if (!displayScoreProgress.booleanValue())
qtiscoreprogress.setVisible(false);
myContent.contextPut("displayScoreProgress", displayScoreProgress);
qtiquestionprogress = new ProgressBar("qtiquestionprogress", 150, 0, 0, "");
myContent.put("qtiquestionprogress", qtiquestionprogress);
Boolean displayQuestionProgress = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_QUESTIONPROGRESS);
// migration,
if (displayQuestionProgress == null)
displayQuestionProgress = Boolean.FALSE;
if (!displayQuestionProgress.booleanValue())
qtiquestionprogress.setVisible(false);
myContent.contextPut("displayQuestionProgress", displayQuestionProgress);
Boolean displayMenu = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_DISPLAYMENU);
// migration
if (displayMenu == null)
displayMenu = Boolean.TRUE;
myContent.contextPut("displayMenu", displayMenu);
Boolean enableCancel = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLECANCEL);
if (enableCancel == null) {
if (// migration:
modConfig.get(IQEditController.CONFIG_KEY_TYPE).equals(AssessmentInstance.QMD_ENTRY_TYPE_ASSESS))
// migration:
enableCancel = Boolean.FALSE;
else
// disable
// cancel
// for
// assessments
// migration: enable otherwise
enableCancel = Boolean.TRUE;
}
myContent.contextPut("enableCancel", enableCancel);
Boolean enableSuspend = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLESUSPEND);
// migration
if (enableSuspend == null)
enableSuspend = Boolean.FALSE;
myContent.contextPut("enableSuspend", enableSuspend);
qtistatus = new IQStatus(translator);
qtistatus.setPreview(iqsec.isPreview());
myContent.contextPut("qtistatus", qtistatus);
setInitialComponent(myContent);
// get the assessment
AssessmentInstance ai = null;
if (repositorySoftkey != null) {
// instantiate from repository
// build path information which will be used to store tempory qti file
String resourcePathInfo = courseResId + File.separator + courseNodeIdent;
ai = AssessmentFactory.createAssessmentInstance(ureq.getIdentity(), ureq.getHttpReq().getRemoteAddr(), modConfig, iqsec.isPreview(), courseResId, courseNodeIdent, resourcePathInfo, this);
} else if (resolver != null) {
// instantiate from given resolver
ai = AssessmentFactory.createAssessmentInstance(ureq.getIdentity(), ureq.getHttpReq().getRemoteAddr(), courseResId, courseNodeIdent, resolver, persister, modConfig, this);
}
// check for null instance or instance with no items
if (ai == null || ai.getAssessmentContext().getSectionContext(0).getItemContextCount() == 0)
throw new AssertException("Assessment Instance was null or no sections/items found.");
if (!iqsec.isAllowed(ai)) {
// security check
getWindowControl().setError(translator.translate("status.notallowed"));
return;
}
if (iqsec.attemptsLeft(ai) < 1) {
// security check
// note: important: do not check on == 0 since the nr of attempts can be
// republished for the same test with a smaller number as the latest time.
getWindowControl().setInfo(translator.translate(ai.isSurvey() ? "status.survey.nomoreattempts" : "status.assess.nomoreattempts"));
return;
}
if (ai.isResuming()) {
getWindowControl().setInfo(translator.translate(ai.isSurvey() ? "status.survey.resumed" : "status.assess.resumed"));
}
ai.setPreview(iqsec.isPreview());
/*
* menu render option: render only section titles or titles and questions.
*/
Object tmp = modConfig.get(IQEditController.CONFIG_KEY_RENDERMENUOPTION);
Boolean renderSectionsOnly;
if (tmp == null) {
// migration
modConfig.set(IQEditController.CONFIG_KEY_RENDERMENUOPTION, Boolean.FALSE);
renderSectionsOnly = Boolean.FALSE;
} else {
renderSectionsOnly = (Boolean) tmp;
}
boolean enabledMenu = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_ENABLEMENU).booleanValue();
boolean itemPageSequence = ((String) modConfig.get(IQEditController.CONFIG_KEY_SEQUENCE)).equals(AssessmentInstance.QMD_ENTRY_SEQUENCE_ITEM);
IQMenuDisplayConf mdc = new IQMenuDisplayConf(renderSectionsOnly.booleanValue(), enabledMenu, itemPageSequence);
Boolean tmpMemo = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_MEMO);
boolean memo = tmpMemo == null ? false : tmpMemo.booleanValue();
qticomp = new IQComponent("qticomponent", translator, ai, mdc, memo);
qticomp.addListener(this);
myContent.put("qticomp", qticomp);
if (!ai.isResuming()) {
Navigator navigator = ai.getNavigator();
navigator.startAssessment();
} else {
// fxdiff BAKS-7 Resume function
AssessmentContext act = ai.getAssessmentContext();
if (act.getCurrentSectionContextPos() >= 0) {
int sectionPos = act.getCurrentSectionContextPos();
OLATResourceable sres = OresHelper.createOLATResourceableInstance("gse", new Long(sectionPos));
WindowControl bwControl = addToHistory(ureq, sres, null, getWindowControl(), false);
if (!ai.isSectionPage()) {
SectionContext sct = act.getCurrentSectionContext();
int itemPos = sct.getCurrentItemContextPos();
if (itemPos >= 0) {
OLATResourceable ires = OresHelper.createOLATResourceableInstance("git", new Long(itemPos));
addToHistory(ureq, ires, null, bwControl, true);
}
}
}
}
qtistatus.update(ai);
if (!qtistatus.isSurvey()) {
qtiscoreprogress.setMax(ai.getAssessmentContext().getMaxScore());
qtiscoreprogress.setActual(ai.getAssessmentContext().getScore());
}
qtiquestionprogress.setMax(Integer.parseInt(qtistatus.getMaxQuestions()));
updateQuestionProgressDisplay(ai);
ready = true;
}
Aggregations