getExtGroups(Long lessonId, String[] extGroupIds) throws Exception;
}
Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java
===================================================================
diff -u -rbbd946d0a18f784ff7f72d0cebaaa3828980dfd0 -rd27ed028b0e16c263776418b7bce22099fed4eed
--- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision bbd946d0a18f784ff7f72d0cebaaa3828980dfd0)
+++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision d27ed028b0e16c263776418b7bce22099fed4eed)
@@ -34,24 +34,29 @@
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.ParseException;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
-import org.apache.struts.action.ActionMessage;
+import org.apache.tomcat.util.json.JSONArray;
+import org.apache.tomcat.util.json.JSONObject;
import org.lamsfoundation.lams.integration.ExtCourseClassMap;
import org.lamsfoundation.lams.integration.ExtServerLessonMap;
import org.lamsfoundation.lams.integration.ExtServerOrgMap;
import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap;
import org.lamsfoundation.lams.integration.ExtUserUseridMap;
import org.lamsfoundation.lams.integration.UserInfoFetchException;
import org.lamsfoundation.lams.integration.UserInfoValidationException;
+import org.lamsfoundation.lams.integration.dto.ExtGroupDTO;
import org.lamsfoundation.lams.integration.security.RandomPasswordGenerator;
+import org.lamsfoundation.lams.integration.util.GroupInfoFetchException;
import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher;
import org.lamsfoundation.lams.lesson.Lesson;
+import org.lamsfoundation.lams.lesson.service.ILessonService;
import org.lamsfoundation.lams.usermanagement.AuthenticationMethod;
import org.lamsfoundation.lams.usermanagement.Organisation;
import org.lamsfoundation.lams.usermanagement.OrganisationState;
@@ -62,11 +67,10 @@
import org.lamsfoundation.lams.usermanagement.UserOrganisationRole;
import org.lamsfoundation.lams.usermanagement.service.IUserManagementService;
import org.lamsfoundation.lams.util.CSVUtil;
-import org.lamsfoundation.lams.util.Configuration;
-import org.lamsfoundation.lams.util.ConfigurationKeys;
import org.lamsfoundation.lams.util.HashUtil;
import org.lamsfoundation.lams.util.LanguageUtil;
import org.lamsfoundation.lams.util.ValidationUtil;
+import org.lamsfoundation.lams.util.WebUtil;
/**
*
@@ -80,15 +84,8 @@
private static Logger log = Logger.getLogger(IntegrationService.class);
private IUserManagementService service;
+ private ILessonService lessonService;
- public IUserManagementService getService() {
- return service;
- }
-
- public void setService(IUserManagementService service) {
- this.service = service;
- }
-
@Override
public ExtServerOrgMap getExtServerOrgMap(String serverId) {
List list = service.findByProperty(ExtServerOrgMap.class, "serverid", serverId);
@@ -544,9 +541,10 @@
service.save(map);
}
+ @Override
public String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException {
// the callback url must contain %username%, %lessonid%, %timestamp% and %hash% eg:
- // "http://test100.ics.mq.edu.au/webapps/lams-plglamscontent-bb_bb60/UserData?uid=%username%&lessonid=%lessonid%&ts=%timestamp%&hash=%hash%";
+ // "http://server.com/lams--bb/UserData?uid=%username%&lessonid=%lessonid%&ts=%timestamp%&hash=%hash%";
// where %username%, %lessonid%, %timestamp% and %hash% will be replaced with their real values
String lessonFinishCallbackUrl = null;
@@ -578,7 +576,149 @@
return lessonFinishCallbackUrl;
}
+
+ @Override
+ public boolean isLessonCreatedUsingIntegrations(Long lessonId) {
+ boolean isLessonCreatedByIntegratedServer = false;
+ if (lessonId != null) {
+ ExtServerLessonMap extServerLesson = getExtServerLessonMap(lessonId);
+ isLessonCreatedByIntegratedServer = extServerLesson != null;
+ }
+
+ return isLessonCreatedByIntegratedServer;
+ }
+
+ @Override
+ public List getExtGroups(Long lessonId, String[] extGroupIds) throws Exception {
+ // the callback url must contain %username%, %lessonid%, %timestamp% and %hash% eg:
+ // "http://server.org/lams-bb/UserData?uid=%username%&lessonid=%lessonid%&ts=%timestamp%&hash=%hash%";
+ // where %username%, %lessonid%, %timestamp% and %hash% will be replaced with their real values
+
+ if (lessonId == null) {
+ throw new GroupInfoFetchException("Fail to fetch group data from external server:"
+ + " specified lessonId is null");
+ }
+
+ Lesson lesson = (Lesson) service.findById(Lesson.class, lessonId);
+ if (lesson == null) {
+ throw new GroupInfoFetchException("Fail to fetch group data from external server:"
+ + " specified lesson is null");
+ }
+ Organisation organisation = lesson.getOrganisation();
+ Integer organisationId = lesson.getOrganisation().getOrganisationId();
+
+ ExtServerLessonMap extServerLesson = getExtServerLessonMap(lessonId);
+ ExtCourseClassMap extCourse = getExtCourseClassMap(organisationId);
+
+ // checks whether the lesson was created from extServer and whether it has lessonFinishCallbackUrl setting
+ if (extServerLesson == null) {
+ throw new GroupInfoFetchException("Fail to fetch group data from external server:"
+ + " there is no corresponding ExtServerLessonMap for lessonId " + lessonId);
+ }
+
+ if (StringUtils.isBlank(extServerLesson.getExtServer().getExtGroupsUrl())) {
+ throw new GroupInfoFetchException("Fail to fetch group data from external server:"
+ + " corresponding ExtCourseClassMap doesn't have extGroupsUrl specified.");
+ }
+
+ if (extCourse == null) {
+ throw new GroupInfoFetchException("Fail to fetch group data from external server:"
+ + " there is no corresponding ExtCourseClassMap for lessonId " + lessonId);
+ }
+
+ ExtServerOrgMap serverMap = extServerLesson.getExtServer();
+
+ // construct real lessonFinishCallbackUrl
+ String lmsGroupsUrl = serverMap.getExtGroupsUrl();
+
+ //in case group info is also requested - provide selected groups' ids
+ if (extGroupIds != null && extGroupIds.length > 0) {
+
+ if (!lmsGroupsUrl.contains("?")) {
+ lmsGroupsUrl += "?";
+ }
+ String extGroupIdsParam = "";
+ for (String extGroupId : extGroupIds) {
+ extGroupIdsParam += "&extGroupIds=" + extGroupId;
+ }
+ lmsGroupsUrl += extGroupIdsParam;
+ }
+
+ String timestamp = Long.toString(new Date().getTime());
+ String hashUsername = "username";
+ String hash = hash(serverMap, hashUsername, timestamp);
+
+ // set values for the parameters
+ HashMap params = new HashMap();
+ params.put("uid", hashUsername);
+ params.put("ts", timestamp);
+ params.put("hash", hash);
+ params.put("course_id", extCourse.getCourseid());
+
+ // send the request to the external server
+ InputStream is = WebUtil.getResponseInputStreamFromExternalServer(lmsGroupsUrl, params);
+ BufferedReader isReader = new BufferedReader(new InputStreamReader(is));
+ String str = isReader.readLine();
+
+ JSONArray jsonGroups = new JSONArray(str);
+ List extGroups = new ArrayList();
+ for (int i = 0; i < jsonGroups.length(); i++) {
+ JSONObject jsonGroup = jsonGroups.getJSONObject(i);
+ ExtGroupDTO group = new ExtGroupDTO();
+ group.setGroupName(jsonGroup.getString("groupName"));
+ group.setGroupId(jsonGroup.getString("groupId"));
+ extGroups.add(group);
+
+ // in case group info is also requested - provide selected groups' ids
+ if (extGroupIds != null && extGroupIds.length > 0) {
+ ArrayList users = new ArrayList();
+
+ JSONArray jsonUsers = jsonGroup.getJSONArray("users");
+ for (int j = 0; j < jsonUsers.length(); j++) {
+ JSONObject jsonUser = jsonUsers.getJSONObject(j);
+
+ String extUsername = jsonUser.getString("userName");
+
+ ExtUserUseridMap extUserUseridMap = getExistingExtUserUseridMap(serverMap, extUsername);
+
+ //create extUserUseridMap if it's not available
+ if (extUserUseridMap == null) {
+ // User properties list format: ,,,,,,
+ // ,,,,,,,
+ String[] userData = new String[14];
+ for (int k=1; k <= 14; k++) {
+ String userProperty = jsonUser.getString("" + k);
+ userData[k-1] = userProperty;
+ }
+ String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10));
+ extUserUseridMap = createExtUserUseridMap(serverMap, extUsername, password, userData, true);
+ }
+ User user = extUserUseridMap.getUser();
+ Integer userId = extUserUseridMap.getUser().getUserId();
+
+ //add user to organisation if it's not there
+ updateUserRoles(user, organisation, false);
+
+ //check if user belong to the lesson. and if not - add it
+ if (!lesson.getLessonClass().getLearnersGroup().hasLearner(user)) {
+ lessonService.addLearner(lessonId, userId);
+ }
+
+ users.add(user);
+ }
+
+ group.setUsers(users);
+ } else {
+ group.setNumberUsers(jsonGroup.getInt("groupSize"));
+ }
+
+ }
+
+ return extGroups;
+ }
+
private ExtServerLessonMap getExtServerLessonMap(Long lessonId) {
List list = service.findByProperty(ExtServerLessonMap.class, "lessonId", lessonId);
if (list == null || list.size() == 0) {
@@ -599,4 +739,21 @@
return (ExtUserUseridMap) list.get(0);
}
}
+
+ private ExtCourseClassMap getExtCourseClassMap(Integer organisationId) {
+ List list = service.findByProperty(ExtCourseClassMap.class, "organisation.organisationId", organisationId);
+ if (list == null || list.size() == 0) {
+ return null;
+ } else {
+ return (ExtCourseClassMap) list.get(0);
+ }
+ }
+
+ public void setService(IUserManagementService service) {
+ this.service = service;
+ }
+
+ public void setLessonService(ILessonService lessonService) {
+ this.lessonService = lessonService;
+ }
}
\ No newline at end of file
Index: lams_common/src/java/org/lamsfoundation/lams/integration/util/GroupInfoFetchException.java
===================================================================
diff -u
--- lams_common/src/java/org/lamsfoundation/lams/integration/util/GroupInfoFetchException.java (revision 0)
+++ lams_common/src/java/org/lamsfoundation/lams/integration/util/GroupInfoFetchException.java (revision d27ed028b0e16c263776418b7bce22099fed4eed)
@@ -0,0 +1,61 @@
+/****************************************************************
+ * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org)
+ * =============================================================
+ * License Information: http://lamsfoundation.org/licensing/lams/2.0/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA
+ *
+ * http://www.gnu.org/licenses/gpl.txt
+ * ****************************************************************
+ */
+
+/* $Id$ */
+package org.lamsfoundation.lams.integration.util;
+
+/**
+ *
+ * View Source
+ *
+ *
+ * @author Andrey Balan
+ */
+@SuppressWarnings("serial")
+public class GroupInfoFetchException extends Exception {
+
+ public GroupInfoFetchException() {
+ }
+
+ /**
+ * @param message
+ */
+ public GroupInfoFetchException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public GroupInfoFetchException(Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public GroupInfoFetchException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
Index: lams_common/src/java/org/lamsfoundation/lams/integrationContext.xml
===================================================================
diff -u -r73c1472c62db79b6ec21be7a5cba1d901f193013 -rd27ed028b0e16c263776418b7bce22099fed4eed
--- lams_common/src/java/org/lamsfoundation/lams/integrationContext.xml (.../integrationContext.xml) (revision 73c1472c62db79b6ec21be7a5cba1d901f193013)
+++ lams_common/src/java/org/lamsfoundation/lams/integrationContext.xml (.../integrationContext.xml) (revision d27ed028b0e16c263776418b7bce22099fed4eed)
@@ -3,6 +3,7 @@
+