diff --git a/src/main/java/org/olat/core/util/event/AbstractEventBus.java b/src/main/java/org/olat/core/util/event/AbstractEventBus.java index 9d92297a63e37f03eb755567c6193602207b8b63..7bcf58d191eb6da6c38211274c3b6b1f07da798a 100644 --- a/src/main/java/org/olat/core/util/event/AbstractEventBus.java +++ b/src/main/java/org/olat/core/util/event/AbstractEventBus.java @@ -122,51 +122,58 @@ public abstract class AbstractEventBus implements EventBus { final Long oresId = ores.getResourceableId(); final String typeName = ores.getResourceableTypeName(); - GenericEventListener[] liArr = null; + GenericEventListener[] listenersArr = null; + GenericEventListener[] listenersTypeArr = null; synchronized (infocenter) { - if (oresId == null) { - EventAgency ea = typeInfocenter.get(typeName); - if (ea != null) { // we are the first listener -> create an agency - liArr = ea.getListeners(); - } - } else { + if (oresId != null) { String oresStr = typeName + "::" + oresId; EventAgency ea = infocenter.get(oresStr); if (ea != null) { - liArr = ea.getListeners(); + listenersArr = ea.getListeners(); } } + EventAgency ea = typeInfocenter.get(typeName); + if (ea != null) { + listenersTypeArr = ea.getListeners(); + } } + + doFire(event, listenersArr); + doFire(event, listenersTypeArr); + } + + private final void doFire(final MultiUserEvent event, final GenericEventListener[] liArr) { + if(liArr == null) return; - if(liArr != null) { - for (int i = 0; i < liArr.length; i++) { - try { - final GenericEventListener listener = liArr[i]; - - //make sure GenericEvents are only sent when controller is not yet disposed - if (listener instanceof Controller) { - Controller dCtrl = (Controller)listener; - if (!dCtrl.isDisposed()) { - ThreadLocalUserActivityLoggerInstaller.runWithUserActivityLogger(new Runnable() { - public void run() { - listener.event(event); - } - }, UserActivityLoggerImpl.newLoggerForEventBus(dCtrl)); - } - } else if(listener != null) { - if(log.isDebug()){ - log.debug("fireEvent: Non-Controller: "+listener); - } - //is there a need to differ the events sent on one VM and in cluster mode? + for (int i = 0; i < liArr.length; i++) { + try { + final GenericEventListener listener = liArr[i]; + + //make sure GenericEvents are only sent when controller is not yet disposed + if (listener instanceof Controller) { + Controller dCtrl = (Controller)listener; + if (!dCtrl.isDisposed()) { ThreadLocalUserActivityLoggerInstaller.runWithUserActivityLogger(new Runnable() { + @Override public void run() { listener.event(event); } - }, ThreadLocalUserActivityLoggerInstaller.createEmptyUserActivityLogger()); + }, UserActivityLoggerImpl.newLoggerForEventBus(dCtrl)); + } + } else if(listener != null) { + if(log.isDebug()){ + log.debug("fireEvent: Non-Controller: "+listener); } - } catch (RuntimeException e) { - log.error("Error while sending generic event: "+liArr[i], e); + //is there a need to differ the events sent on one VM and in cluster mode? + ThreadLocalUserActivityLoggerInstaller.runWithUserActivityLogger(new Runnable() { + @Override + public void run() { + listener.event(event); + } + }, ThreadLocalUserActivityLoggerInstaller.createEmptyUserActivityLogger()); } + } catch (RuntimeException e) { + log.error("Error while sending generic event: "+liArr[i], e); } } } diff --git a/src/main/java/org/olat/course/assessment/AssessmentModule.java b/src/main/java/org/olat/course/assessment/AssessmentModule.java index c6a0cb84ced9d44b7d49d73848058f3e1ecf13c2..2554cc640b5cde9909e86f7eda360c0b022f8b7c 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentModule.java +++ b/src/main/java/org/olat/course/assessment/AssessmentModule.java @@ -130,12 +130,11 @@ public class AssessmentModule extends AbstractSpringModule implements GenericEve public void event(Event event) { if (event instanceof PublishEvent) { PublishEvent pe = (PublishEvent) event; - //FIXME: LD: temporary introduced the (pe.getCommand() == PublishEvent.EVENT_IDENTIFIER) to filter the events from the same VM - if (pe.getState() == PublishEvent.PRE_PUBLISH && pe.getEventIdentifier() == PublishEvent.EVENT_IDENTIFIER) { + if (pe.getState() == PublishEvent.PRE_PUBLISH && pe.isEventOnThisNode()) { // PRE PUBLISH -> check node for changes addToUpcomingWork(pe); return; - } else if (pe.getState() == PublishEvent.PUBLISH && pe.getEventIdentifier() == PublishEvent.EVENT_IDENTIFIER) { + } else if (pe.getState() == PublishEvent.PUBLISH && pe.isEventOnThisNode()) { // a publish event, check if it matches a previous checked prepareUpdate(pe.getPublishedCourseResId()); } diff --git a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java index ebf2473260a7c14976b8ca5243a205aea52f03e9..711ecb5f5d4daafa0803b2c463ad8dadf10928d3 100644 --- a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java +++ b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java @@ -858,7 +858,7 @@ public class NewCachePersistingAssessmentManager extends BasicManager implements * @see org.olat.course.assessment.AssessmentManager#saveScoreEvaluation(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, org.olat.core.id.Identity, org.olat.course.run.scoring.ScoreEvaluation) */ public void saveScoreEvaluation(final CourseNode courseNode, final Identity identity, final Identity assessedIdentity, final ScoreEvaluation scoreEvaluation, - final UserCourseEnvironment userCourseEnv, final boolean incrementUserAttempts) { + final UserCourseEnvironment assessedUserCourseEnv, final boolean incrementUserAttempts) { final ICourse course = CourseFactory.loadCourse(ores); final CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager(); final RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); @@ -880,10 +880,10 @@ public class NewCachePersistingAssessmentManager extends BasicManager implements attempts = incrementNodeAttemptsProperty(courseNode, assessedIdentity, cpm); } if(courseNode instanceof AssessableCourseNode) { - userCourseEnv.getScoreAccounting().scoreInfoChanged((AssessableCourseNode)courseNode, scoreEvaluation); + assessedUserCourseEnv.getScoreAccounting().scoreInfoChanged((AssessableCourseNode)courseNode, scoreEvaluation); // Update users efficiency statement EfficiencyStatementManager esm = EfficiencyStatementManager.getInstance(); - esm.updateUserEfficiencyStatement(userCourseEnv); + esm.updateUserEfficiencyStatement(assessedUserCourseEnv); } if(passed != null && passed.booleanValue() && course.getCourseConfig().isAutomaticCertificationEnabled()) { diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java index c568f181b047e753ce0fd47851723c2feaf1d7a4..dcef2d4fe96b789aa892a1355f7cd8377beec788 100644 --- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java @@ -242,6 +242,8 @@ public class PersistingCourseGroupManager extends BasicManager implements Course */ @Override public List<BusinessGroup> getOwnedBusinessGroups(Identity identity) { + if(identity == null) return new ArrayList<>(); + SearchBusinessGroupParams params = new SearchBusinessGroupParams(identity, true, false); List<BusinessGroup> allGroups = businessGroupService.findBusinessGroups(params, getCourseEntry(), 0, -1); @@ -253,6 +255,8 @@ public class PersistingCourseGroupManager extends BasicManager implements Course */ @Override public List<BusinessGroup> getParticipatingBusinessGroups(Identity identity) { + if(identity == null) return new ArrayList<>(); + SearchBusinessGroupParams params = new SearchBusinessGroupParams(identity, false, true); List<BusinessGroup> allGroups = businessGroupService.findBusinessGroups(params, getCourseEntry(), 0, -1); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityCheckListController.java b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityCheckListController.java index addfd6296ffd4fda9651a5ef8d7ff927fa81d46d..fa449d3c9fdc8c644ff219a86b945c6bb3b5a2e8 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityCheckListController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityCheckListController.java @@ -69,7 +69,7 @@ public class AssessedIdentityCheckListController extends FormBasicController { private final boolean saveAndClose; private final ModuleConfiguration config; private final CheckListCourseNode courseNode; - private final UserCourseEnvironment userCourseEnv; + private final UserCourseEnvironment assessedUserCourseEnv; private final OLATResourceable courseOres; private final Identity assessedIdentity; private final CheckboxList checkboxList; @@ -82,13 +82,13 @@ public class AssessedIdentityCheckListController extends FormBasicController { public AssessedIdentityCheckListController(UserRequest ureq, WindowControl wControl, Identity assessedIdentity, OLATResourceable courseOres, - UserCourseEnvironment userCourseEnv, CheckListCourseNode courseNode, boolean saveAndClose) { + UserCourseEnvironment assessedUserCourseEnv, CheckListCourseNode courseNode, boolean saveAndClose) { super(ureq, wControl); this.courseNode = courseNode; this.courseOres = courseOres; this.saveAndClose = saveAndClose; - this.userCourseEnv = userCourseEnv; + this.assessedUserCourseEnv = assessedUserCourseEnv; config = courseNode.getModuleConfiguration(); Boolean hasScore = (Boolean)config.get(MSCourseNode.CONFIG_KEY_HAS_SCORE_FIELD); withScore = (hasScore == null || hasScore.booleanValue()); @@ -278,7 +278,7 @@ public class AssessedIdentityCheckListController extends FormBasicController { } checkboxManager.check(courseOres, courseNode.getIdent(), batchElements); - courseNode.updateScoreEvaluation(userCourseEnv, assessedIdentity); + courseNode.updateScoreEvaluation(assessedUserCourseEnv, assessedIdentity); } private void doUpdateCheck(CheckboxWrapper wrapper, boolean check) { diff --git a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java index dbe0ab670699e9d4501e85e83910ab19a03b01cc..900848b24f51ad7ab698d8a618504f42c8353f55 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java @@ -60,19 +60,19 @@ public class AssessedIdentityOverviewController extends BasicController { private final Identity assessedIdentity; private final OLATResourceable courseOres; private final CheckListCourseNode courseNode; - private final UserCourseEnvironment userCourseEnv; + private final UserCourseEnvironment assessedUserCourseEnv; private boolean changes = false; public AssessedIdentityOverviewController(UserRequest ureq, WindowControl wControl, Identity assessedIdentity, OLATResourceable courseOres, - UserCourseEnvironment userCourseEnv, CheckListCourseNode courseNode) { + UserCourseEnvironment assessedUserCourseEnv, CheckListCourseNode courseNode) { super(ureq, wControl); this.courseNode = courseNode; this.courseOres = courseOres; this.assessedIdentity = assessedIdentity; - this.userCourseEnv = userCourseEnv; + this.assessedUserCourseEnv = assessedUserCourseEnv; mainVC = createVelocityContainer("user_assessment"); @@ -150,7 +150,7 @@ public class AssessedIdentityOverviewController extends BasicController { private void doOpenCheckList(UserRequest ureq) { if(listCtrl == null) { listCtrl = new AssessedIdentityCheckListController(ureq, getWindowControl(), assessedIdentity, - courseOres, userCourseEnv, courseNode, true); + courseOres, assessedUserCourseEnv, courseNode, true); listenTo(listCtrl); } mainVC.put("segmentCmp", listCtrl.getInitialComponent()); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java index 40f8bca400b9e9d4b4c97f2f78873cc04cf2c43a..31a59be69365911ebe42f0f9ff027f1f13e896de 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java @@ -72,6 +72,7 @@ import org.olat.core.id.UserConstants; import org.olat.core.util.StringHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; +import org.olat.course.assessment.AssessmentHelper; import org.olat.course.nodes.CheckListCourseNode; import org.olat.course.nodes.MSCourseNode; import org.olat.course.nodes.cl.CheckboxManager; @@ -95,6 +96,8 @@ import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; /** + * + * This is the coach view. * * Initial date: 07.02.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com @@ -115,7 +118,7 @@ public class CheckListAssessmentController extends FormBasicController implement private final OLATResourceable courseOres; private final CheckListCourseNode courseNode; private final ModuleConfiguration config; - private final UserCourseEnvironment userCourseEnv; + private final UserCourseEnvironment coachCourseEnv; private final boolean isAdministrativeUser; private final List<UserPropertyHandler> userPropertyHandlers; @@ -143,7 +146,7 @@ public class CheckListAssessmentController extends FormBasicController implement * @param wControl * @param courseNode */ - public CheckListAssessmentController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, + public CheckListAssessmentController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment coachCourseEnv, OLATResourceable courseOres, CheckListCourseNode courseNode) { super(ureq, wControl, "assessment_list"); @@ -158,7 +161,7 @@ public class CheckListAssessmentController extends FormBasicController implement this.courseOres = courseOres; this.courseNode = courseNode; - this.userCourseEnv = userCourseEnv; + this.coachCourseEnv = coachCourseEnv; config = courseNode.getModuleConfiguration(); CheckboxList configCheckboxList = (CheckboxList)config.get(CheckListCourseNode.CONFIG_KEY_CHECKBOX); if(configCheckboxList == null) { @@ -243,8 +246,8 @@ public class CheckListAssessmentController extends FormBasicController implement List<CheckListAssessmentRow> datas = loadDatas(); model = new CheckListAssessmentDataModel(checkboxList, datas, columnsModel); table = uifactory.addTableElement(getWindowControl(), "checkbox-list", model, getTranslator(), formLayout); - if(userCourseEnv instanceof UserCourseEnvironmentImpl) { - UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)userCourseEnv; + if(coachCourseEnv instanceof UserCourseEnvironmentImpl) { + UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)coachCourseEnv; List<BusinessGroup> coachedGroups = env.getCoachedGroups(); List<FlexiTableFilter> filters = new ArrayList<>(coachedGroups.size() + 1); filters.add(new FlexiTableFilter(translate("filter.all"), "all")); @@ -276,11 +279,11 @@ public class CheckListAssessmentController extends FormBasicController implement } private List<CheckListAssessmentRow> loadDatas() { - if(!(userCourseEnv instanceof UserCourseEnvironmentImpl)) { + if(!(coachCourseEnv instanceof UserCourseEnvironmentImpl)) { return Collections.emptyList(); } - UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)userCourseEnv; + UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)coachCourseEnv; List<Checkbox> checkboxColl = checkboxList.getList(); int numOfCheckbox = checkboxList.getNumOfCheckbox(); @@ -300,7 +303,7 @@ public class CheckListAssessmentController extends FormBasicController implement } List<BusinessGroup> coachedGroups = courseAdmin ? - userCourseEnv.getCourseEnvironment().getCourseGroupManager().getAllBusinessGroups() + coachCourseEnv.getCourseEnvironment().getCourseGroupManager().getAllBusinessGroups() : env.getCoachedGroups(); List<AssessmentData> dataList = checkboxManager.getAssessmentDatas(courseOres, courseNode.getIdent(), courseTutor || courseAdmin ? re : null, coachedGroups); List<CheckListAssessmentRow> boxList = getAssessmentDataViews(dataList, checkboxColl); @@ -481,7 +484,7 @@ public class CheckListAssessmentController extends FormBasicController implement List<CheckListAssessmentRow> rows = model.getObjects(); boxAssessmentCtrl = new CheckboxAssessmentController(ureq, getWindowControl(), checkboxList, rows, - courseOres, userCourseEnv, courseNode); + courseOres, courseNode); listenTo(boxAssessmentCtrl); String title = translate("box.assessment"); @@ -557,9 +560,11 @@ public class CheckListAssessmentController extends FormBasicController implement if(assessedIdentityToUpdate.size() > 0) { DBFactory.getInstance().commit(); + ICourse course = CourseFactory.loadCourse(courseOres); List<Identity> identities = securityManager.loadIdentityByKeys(assessedIdentityToUpdate); for(Identity identity:identities) { - courseNode.updateScoreEvaluation(userCourseEnv, identity); + UserCourseEnvironment assessedUserCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(identity, course); + courseNode.updateScoreEvaluation(assessedUserCourseEnv, identity); } } @@ -623,9 +628,11 @@ public class CheckListAssessmentController extends FormBasicController implement private void doOpenEdit(UserRequest ureq, CheckListAssessmentRow row) { if(editCtrl != null) return; + ICourse course = CourseFactory.loadCourse(courseOres); Identity assessedIdentity = securityManager.loadIdentityByKey(row.getIdentityKey()); + UserCourseEnvironment assessedUserCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course); editCtrl = new AssessedIdentityOverviewController(ureq, getWindowControl(), assessedIdentity, - courseOres, userCourseEnv, courseNode); + courseOres, assessedUserCourseEnv, courseNode); listenTo(editCtrl); String title = courseNode.getShortTitle(); diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java index 7ba853945cfe4278ffb555724744ad6222a3aa83..fdd24d53217d9f2a744ac0d2ce9a72ee1129baa2 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java @@ -56,6 +56,8 @@ import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; import org.olat.core.id.UserConstants; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentHelper; import org.olat.course.nodes.CheckListCourseNode; import org.olat.course.nodes.MSCourseNode; @@ -99,17 +101,14 @@ public class CheckboxAssessmentController extends FormBasicController { private int currentCheckboxIndex = 0; private final OLATResourceable courseOres; private final CheckListCourseNode courseNode; - private final UserCourseEnvironment userCourseEnv; public CheckboxAssessmentController(UserRequest ureq, WindowControl wControl, CheckboxList checkboxList, - List<CheckListAssessmentRow> initialRows, OLATResourceable courseOres, - UserCourseEnvironment userCourseEnv, CheckListCourseNode courseNode) { + List<CheckListAssessmentRow> initialRows, OLATResourceable courseOres, CheckListCourseNode courseNode) { super(ureq, wControl, "assessment_per_box"); this.courseNode = courseNode; this.courseOres = courseOres; this.initialRows = initialRows; this.checkboxList = checkboxList; - this.userCourseEnv = userCourseEnv; ModuleConfiguration config = courseNode.getModuleConfiguration(); Boolean hasScore = (Boolean)config.get(MSCourseNode.CONFIG_KEY_HAS_SCORE_FIELD); @@ -380,9 +379,11 @@ public class CheckboxAssessmentController extends FormBasicController { if(assessedIdentityToUpdate.size() > 0) { DBFactory.getInstance().commit(); + ICourse course = CourseFactory.loadCourse(courseOres); List<Identity> identities = securityManager.loadIdentityByKeys(assessedIdentityToUpdate); for(Identity identity:identities) { + UserCourseEnvironment userCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(identity, course); courseNode.updateScoreEvaluation(userCourseEnv, identity); } } diff --git a/src/main/java/org/olat/course/nodes/scorm/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/scorm/_i18n/LocalStrings_fr.properties index ed612baa992e23e304f1741d5b2ff18dd1679c42..d4d6f38d67aa1e970e00b8935bec9b9be0c77851 100644 --- a/src/main/java/org/olat/course/nodes/scorm/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/course/nodes/scorm/_i18n/LocalStrings_fr.properties @@ -38,7 +38,7 @@ pane.tab.delivery=$org.olat.core.gui.control.generic.iframe\:option.delivery passed.no=Pas r\u00E9ussi passed.yes=R\u00E9ussi passed.yourpassed=Statut -score.noscoreinfoyet=Il n'y a pas d'indications de poinst pour cet objet SCORM, car vous ne l'avez encore jamais effectu\u00E9. +score.noscoreinfoyet=Il n'y a pas d'indications de points pour cet objet SCORM, car vous ne l'avez encore jamais effectu\u00E9. score.title=Points score.yourscore=Nombre de points obtenus showmenu.label=Afficher le menu diff --git a/src/main/java/org/olat/user/propertyhandlers/SkypePropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/SkypePropertyHandler.java index 1cdaecf086812e555fb24d461219627e5e590e3c..d684ec2a23fbd8731236a060c90671bfdc00e35f 100644 --- a/src/main/java/org/olat/user/propertyhandlers/SkypePropertyHandler.java +++ b/src/main/java/org/olat/user/propertyhandlers/SkypePropertyHandler.java @@ -47,7 +47,7 @@ public class SkypePropertyHandler extends Generic127CharTextPropertyHandler { if (StringHelper.containsNonWhitespace(skypeid)) { skypeid = StringHelper.escapeHtml(skypeid); StringBuilder sb = new StringBuilder(); - sb.append("<span>s_rosse</span> <div id=\"SkypeButton_Call_").append(skypeid).append("_1\" class=\"o_skype_button\">") + sb.append("<span>").append(skypeid).append("</span> <div id=\"SkypeButton_Call_").append(skypeid).append("_1\" class=\"o_skype_button\">") .append("<script type=\"text/javascript\">\n") .append("try{ jQuery.getScript('https://secure.skypeassets.com/i/scom/js/skype-uri.js', function() {\n") .append("Skype.ui({\n")