private void syncSiteMembershipsOnceThenSchedule( Map payload, Site site, boolean isTrustedConsumer, boolean isEmailTrustedConsumer) throws LTIException { if (isTrustedConsumer) return; M_log.debug("synchSiteMembershipsOnceThenSchedule"); if (!ServerConfigurationService.getBoolean(SakaiBLTIUtil.INCOMING_ROSTER_ENABLED, false)) { M_log.info("LTI Memberships synchronization disabled."); return; } final String membershipsUrl = (String) payload.get("ext_ims_lis_memberships_url"); if (!BasicLTIUtil.isNotBlank(membershipsUrl)) { M_log.info("LTI Memberships extension is not supported."); return; } if (M_log.isDebugEnabled()) M_log.debug("Memberships URL: " + membershipsUrl); final String membershipsId = (String) payload.get("ext_ims_lis_memberships_id"); if (!BasicLTIUtil.isNotBlank(membershipsId)) { M_log.info("No memberships id supplied. Memberships will NOT be synchronized."); return; } final String siteId = site.getId(); // If this site has already been scheduled, then we do nothing. if (ltiService.getMembershipsJob(siteId) != null) { if (M_log.isDebugEnabled()) { M_log.debug( "Site '" + siteId + "' already scheduled for memberships sync. Doing nothing ..."); } return; } final String oauth_consumer_key = (String) payload.get(OAuth.OAUTH_CONSUMER_KEY); // This is non standard. Moodle's core LTI plugin does not currently do memberships and // a fix for this has been proposed at https://tracker.moodle.org/browse/MDL-41724. I don't // think this will ever become core and the first time memberships will appear in core lti // is with LTI2. At that point this code will be replaced with standard LTI2 JSON type stuff. String lms = (String) payload.get("ext_lms"); final String callbackType = (BasicLTIUtil.isNotBlank(lms) && lms.equals("moodle-2")) ? "ext-moodle-2" : (String) payload.get(BasicLTIConstants.LTI_VERSION); (new Thread( new Runnable() { public void run() { long then = 0L; if (M_log.isDebugEnabled()) { M_log.debug("Starting memberships sync."); then = (new Date()).getTime(); } siteMembershipsSynchroniser.synchroniseSiteMemberships( siteId, membershipsId, membershipsUrl, oauth_consumer_key, isEmailTrustedConsumer, callbackType); if (M_log.isDebugEnabled()) { long now = (new Date()).getTime(); M_log.debug( "Memberships sync finished. It took " + ((now - then) / 1000) + " seconds."); } } }, "org.sakaiproject.blti.ProviderServlet.MembershipsSync")) .start(); ltiService.insertMembershipsJob( siteId, membershipsId, membershipsUrl, oauth_consumer_key, callbackType); }