getExtGroups(Long lessonId, String[] extGroupIds) throws Exception;
}
Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java
===================================================================
diff -u -ra939bcf145b0e4deab5838f87b047df5ca48c92d -rd0a703641dee45b84a2cd9a011376a8f0d72c9fb
--- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision a939bcf145b0e4deab5838f87b047df5ca48c92d)
+++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision d0a703641dee45b84a2cd9a011376a8f0d72c9fb)
@@ -34,23 +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.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;
@@ -64,6 +70,7 @@
import org.lamsfoundation.lams.util.HashUtil;
import org.lamsfoundation.lams.util.LanguageUtil;
import org.lamsfoundation.lams.util.ValidationUtil;
+import org.lamsfoundation.lams.util.WebUtil;
/**
*
@@ -77,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);
@@ -561,7 +561,7 @@
@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;
@@ -594,7 +594,151 @@
return lessonFinishCallbackUrl;
}
+
+ @Override
+ public boolean isIntegratedServerGroupFetchingAvailable(Long lessonId) {
+ boolean isIntegratedServerGroupFetchingAvailable = false;
+ if (lessonId != null) {
+ ExtServerLessonMap extServerLesson = getExtServerLessonMap(lessonId);
+ isIntegratedServerGroupFetchingAvailable = (extServerLesson != null)
+ && StringUtils.isNotBlank(extServerLesson.getExtServer().getExtGroupsUrl());
+ }
+
+ return isIntegratedServerGroupFetchingAvailable;
+ }
+
+ @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 salt = HashUtil.salt();
+ String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10));
+ extUserUseridMap = createExtUserUseridMap(serverMap, extUsername, password, salt, 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)) {
@@ -615,4 +759,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 d0a703641dee45b84a2cd9a011376a8f0d72c9fb)
@@ -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 -ra6641bf9262a01d07740a517643f8fe187ec5b1f -rd0a703641dee45b84a2cd9a011376a8f0d72c9fb
--- lams_common/src/java/org/lamsfoundation/lams/integrationContext.xml (.../integrationContext.xml) (revision a6641bf9262a01d07740a517643f8fe187ec5b1f)
+++ lams_common/src/java/org/lamsfoundation/lams/integrationContext.xml (.../integrationContext.xml) (revision d0a703641dee45b84a2cd9a011376a8f0d72c9fb)
@@ -7,6 +7,7 @@
+