Index: lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java =================================================================== diff -u -rf9992d0803d826cdd027b141fba56d1a2de77847 -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision f9992d0803d826cdd027b141fba56d1a2de77847) +++ lams_central/src/java/org/lamsfoundation/lams/util/CentralConstants.java (.../CentralConstants.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -91,8 +91,10 @@ public static final String ATTR_ACTIVITIES_COMPLETED = "activitiesCompleted"; - public static final String ATTR_PERCENTAGE_COMPLETE = "percentageComplete"; + public static final String ATTR_ACTIVITIES_ATTEMPTED = "attemptedActivities"; + public static final String ATTR_CURRENT_ACTIVITY = "currentActivity"; + public static final String ELEM_LEARNER_PROGRESS = "LearnerProgress"; public static final String ELEM_FOLDER = "Folder"; Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== diff -u -r46e53a35659cb1f224bbe4bac0be42d9825eced0 -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 46e53a35659cb1f224bbe4bac0be42d9825eced0) +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -109,6 +109,20 @@ String countryIsoCode = request.getParameter(LoginRequestDispatcher.PARAM_COUNTRY); String langIsoCode = request.getParameter(LoginRequestDispatcher.PARAM_LANGUAGE); + String firstName = ""; + String lastName = ""; + String email = ""; + + try{ + firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME); + lastName = request.getParameter(LoginRequestDispatcher.PARAM_LAST_NAME); + email = request.getParameter(LoginRequestDispatcher.PARAM_EMAIL); + } catch (NullPointerException e) + { + log.info("Not using implicit logon"); + } + + if (extUsername == null || method == null || serverId == null || timestamp == null || hash == null || extCourseId == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, @@ -118,7 +132,18 @@ ExtServerOrgMap serverMap = getService().getExtServerOrgMap(serverId); try { - ExtUserUseridMap userMap = getService().getExtUserUseridMap(serverMap, extUsername); + ExtUserUseridMap userMap = null; + + if (firstName.equals("") && lastName.equals("")) + { + userMap = getService().getExtUserUseridMap(serverMap, extUsername); + } + else + { + userMap = getService().getImplicitExtUserUseridMap(serverMap, extUsername, firstName, lastName, langIsoCode, countryIsoCode, email); + } + + Authenticator.authenticate(serverMap, timestamp, extUsername, method, hash); ExtCourseClassMap orgMap = getService().getExtCourseClassMap(serverMap, userMap, extCourseId, countryIsoCode, langIsoCode); User user = userMap.getUser(); @@ -165,17 +190,22 @@ hses.setAttribute(AttributeNames.USER, user.getUserDTO()); response.sendRedirect("j_security_check?j_username=" + login + "&j_password=" + pass); } catch (AuthenticationException e) { + log.error("Authentication error: ", e); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Login Failed - authentication error"); } catch (UserInfoFetchException e) { + log.error("User fetch info error: ", e); response.sendError(HttpServletResponse.SC_BAD_GATEWAY, "Login Failed - failed to fetch user info from the third party server"); } catch (FailedLoginException e) { + log.error("Login error: ", e); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Login Failed - user was not found"); } catch (NamingException e) { + log.error("Naming error: ", e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } catch (SQLException e) { + log.error("Database error: ", e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } } Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java =================================================================== diff -u -r20e8c2d969b20e2ae825bbd86bf8827c3b1850a8 -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision 20e8c2d969b20e2ae825bbd86bf8827c3b1850a8) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -27,6 +27,7 @@ import org.lamsfoundation.lams.integration.security.AuthenticationException; import org.lamsfoundation.lams.integration.security.Authenticator; import org.lamsfoundation.lams.integration.service.IntegrationService; +import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher; import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.util.CentralConstants; @@ -281,6 +282,20 @@ String lang = request.getParameter(CentralConstants.PARAM_LANG); String modeStr = request.getParameter(CentralConstants.PARAM_MODE); + String firstName = ""; + String lastName = ""; + String email = ""; + + try{ + firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME); + lastName = request.getParameter(LoginRequestDispatcher.PARAM_LAST_NAME); + email = request.getParameter(LoginRequestDispatcher.PARAM_EMAIL); + } catch (NullPointerException e) + { + } + + + if (serverId == null || datetime == null || hashValue == null || username == null || courseId == null || country == null || lang == null || modeStr == null) { @@ -301,9 +316,17 @@ .authenticate(serverMap, datetime, username, hashValue); // get user map, user is created if this is their first use - - ExtUserUseridMap userMap = integrationService.getExtUserUseridMap(serverMap, - username); + + ExtUserUseridMap userMap = null; + if (firstName.equals("") && lastName.equals("")) + { + userMap = integrationService.getExtUserUseridMap(serverMap, username); + } + else + { + userMap = integrationService.getImplicitExtUserUseridMap(serverMap, username, firstName, lastName, lang, country, email); + } + // create group for external course if necessary Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java =================================================================== diff -u -ra849872468aa49fca801f113ec6a65a42f50297e -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision a849872468aa49fca801f113ec6a65a42f50297e) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -48,6 +48,7 @@ import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.CentralConstants; import org.lamsfoundation.lams.util.DateUtil; +import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -330,12 +331,28 @@ String prefix = serverMap.getPrefix(); if(lesson!=null){ - int activities = lesson.getLearningDesign().getActivities().size(); + int activitiesTotal = lesson.getLearningDesign().getActivities().size(); Iterator iterator = lesson.getLearnerProgresses().iterator(); while(iterator.hasNext()){ LearnerProgress learnProg = (LearnerProgress)iterator.next(); LearnerProgressDTO learnerProgress = learnProg.getLearnerProgressData(); + //Iterator activities = learnProg.getLesson().getLearningDesign().getActivities().iterator(); + + //String currActivity = ""; + //while (activities.hasNext()) + //{ + // Activity act = (Activity)iterator.next(); + // + // if (learnerProgress.getCurrentActivityId() == ((Activity)iterator.next()).getActivityId()) + // { + // currActivity = act.getTitle(); + // break; + // } + //} + + + // get the username with the integration prefix removed String userNoPrefixName = learnerProgress.getUserName(). substring(prefix.length()+1); @@ -345,18 +362,15 @@ Element learnerProgElem = document.createElement(CentralConstants.ELEM_LEARNER_PROGRESS); int completedActivities = learnerProgress.getCompletedActivities().length; + int attemptedActivities = learnerProgress.getAttemptedActivities().length; - float percentageComplete; - - percentageComplete = (float)completedActivities/(float)activities; - percentageComplete *= 100; - if(learnerProgElem.getNodeType()== Node.ELEMENT_NODE) { learnerProgElem.setAttribute(CentralConstants.ATTR_LESSON_COMPLETE , "" + learnerProgress.getLessonComplete()); - learnerProgElem.setAttribute(CentralConstants.ATTR_ACTIVITY_COUNT , "" + activities); + learnerProgElem.setAttribute(CentralConstants.ATTR_ACTIVITY_COUNT , "" + activitiesTotal); learnerProgElem.setAttribute(CentralConstants.ATTR_ACTIVITIES_COMPLETED , "" + completedActivities); - learnerProgElem.setAttribute(CentralConstants.ATTR_PERCENTAGE_COMPLETE , "" + percentageComplete); + learnerProgElem.setAttribute(CentralConstants.ATTR_ACTIVITIES_ATTEMPTED , "" + attemptedActivities); + //learnerProgElem.setAttribute(CentralConstants.ATTR_CURRENT_ACTIVITY , currActivity); learnerProgElem.setAttribute(CentralConstants.ATTR_STUDENT_ID, "" + learnerMap.getSid()); learnerProgElem.setAttribute(CentralConstants.ATTR_COURSE_ID, courseID); learnerProgElem.setAttribute(CentralConstants.ATTR_USERNAME, userNoPrefixName); Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== diff -u -r206cb40e4252d7fb4c26b5468d2991d9a91812e5 -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 206cb40e4252d7fb4c26b5468d2991d9a91812e5) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -47,6 +47,16 @@ ExtServerOrgMap getExtServerOrgMap(String serverId); + ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, + String extUsername, + String firstName, + String lastName, + String language, + String country, + String email) + throws UserInfoFetchException; + + List getAllExtServerOrgMaps(); void saveExtServerOrgMap(ExtServerOrgMap map); Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -r4f6235f53dbd594d4ccfbad02bca53f3b598336c -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 4f6235f53dbd594d4ccfbad02bca53f3b598336c) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -119,7 +119,11 @@ service.save(user); } - public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException { + public ExtUserUseridMap getExtUserUseridMap( + ExtServerOrgMap serverMap, + String extUsername) + throws UserInfoFetchException + { Map properties = new HashMap(); properties.put("extServerOrgMap.sid", serverMap.getSid()); properties.put("extUsername", extUsername); @@ -130,6 +134,27 @@ return (ExtUserUseridMap)list.get(0); } } + + public ExtUserUseridMap getImplicitExtUserUseridMap( + ExtServerOrgMap serverMap, + String extUsername, + String firstName, + String lastName, + String language, + String country, + String email) + throws UserInfoFetchException + { + Map properties = new HashMap(); + properties.put("extServerOrgMap.sid", serverMap.getSid()); + properties.put("extUsername", extUsername); + List list = service.findByProperties(ExtUserUseridMap.class, properties); + if(list==null || list.size()==0){ + return createImplicitExtUserUseridMap(serverMap, extUsername, firstName, lastName, language, country, email); + }else{ + return (ExtUserUseridMap)list.get(0); + } + } private ExtCourseClassMap createExtCourseClassMap(ExtServerOrgMap serverMap, User user, String extCourseId, String countryIsoCode, String langIsoCode) { Organisation org = new Organisation(); @@ -184,6 +209,50 @@ addMemberships(user, serverMap.getOrganisation()); return map; } + + public ExtUserUseridMap createImplicitExtUserUseridMap(ExtServerOrgMap serverMap, + String extUsername, + String firstName, + String lastName, + String language, + String country, + String email) throws UserInfoFetchException + { + + User user = new User(); + user.setLogin(buildName(serverMap.getPrefix(),extUsername)); + user.setPassword(HashUtil.sha1(RandomPasswordGenerator.nextPassword(10))); + user.setTitle(""); + user.setFirstName(firstName); + user.setLastName(lastName); + user.setAddressLine1(""); + user.setCity(""); + user.setState(""); + user.setPostcode(""); + user.setCountry(""); + user.setDayPhone(""); + user.setMobilePhone(""); + user.setFax(""); + user.setEmail(email); + user.setAuthenticationMethod((AuthenticationMethod)service.findById(AuthenticationMethod.class, AuthenticationMethod.DB)); + user.setCreateDate(new Date()); + user.setDisabledFlag(false); + user.setLocale(LanguageUtil.getSupportedLocale(language, country)); + user.setFlashTheme(service.getDefaultFlashTheme()); + user.setHtmlTheme(service.getDefaultHtmlTheme()); + service.save(user); + ExtUserUseridMap map = new ExtUserUseridMap(); + map.setExtServerOrgMap(serverMap); + map.setExtUsername(extUsername); + map.setUser(user); + service.save(map); + // every integration user is added to the group for their 3rd party server; + // becomes the 'public' folder for that server + addMemberships(user, serverMap.getOrganisation()); + return map; + + } + private String[] getUserDataFromExtServer(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException { //the callback url must contain %username%, %timestamp% and %hash% Index: lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java =================================================================== diff -u -r413ef9db9a94b751e76d21c66a2300c79e95e24a -r8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7 --- lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision 413ef9db9a94b751e76d21c66a2300c79e95e24a) +++ lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision 8fe3adcab07a1cc7fbc4fbaa0e9517a224055ec7) @@ -62,6 +62,12 @@ public static final String PARAM_REQUEST_SRC ="requestSrc"; public static final String PARAM_NOTIFY_CLOSE_URL ="notifyCloseURL"; + + public static final String PARAM_FIRST_NAME = "firstName"; + + public static final String PARAM_LAST_NAME = "lastName"; + + public static final String PARAM_EMAIL = "email"; public static final String METHOD_AUTHOR = "author";