Index: lams_tool_zoom/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -reeaae70bac24a36a5f05a5d56638df29c1a495c5 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision eeaae70bac24a36a5f05a5d56638df29c1a495c5) +++ lams_tool_zoom/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -32,37 +32,36 @@ label.lastModified =Last modified label.notebookEntry =Notebook entry label.authoring.basic.instructions =Instructions -label.authoring.basic.zoomSettings =Zoom settings label.on =On label.off =Off label.monitoring.startConference =Start conference -label.learning.joinConference =Join conference label.learning.conferenceNotAvailable =Zoom meeting is not available yet. Please see your instructor for further details. label.refresh =Refresh -label.cancel =Cancel message.defineLaterSet =Please wait for the teacher to complete the contents of this activity -message.learner.blank.input =You have not written anything. Are you sure this is correct? message.alertContentEdit =Warning: One of more learners have accessed this activity. Changing this content will result in learners getting different information. -message.warnLockOnFinish =Note: After you click on "Next Activity", you won't be able to continue participating in the conference. -message.activityLocked =You won't be able to continue participating in the conference after you have completed. message.no.reflection.available =Notebook not available -message.endMeeting =The meeting room is now closed. You can continue with your sequence. heading.totalLearners =Number of learners heading.totalLearnersInGroup =Total number of learners in group -heading.totalFinishedLearnersInGroup =Number of finished learners heading.learner =Learner heading.notebookEntry =Notebook entry -error.mandatoryField ={0} field is mandatory. -error.optionalField ={0} has been left blank. advanced.reflectOnActivity =Add a notebook at end of Zoom activity with the following instructions authoring.msg.cancel.save =Do you want to close this window without saving? monitor.summary.th.advancedSettings =Advanced settings monitor.summary.zoomSettings =Zoom settings admin.title =Zoom Administration -message.unableToStartLesson =Unable to join meeting. Please see your instructor. button.submit =Finish message.monitoring.summary.no.session =No session available label.activity.completion =End of activity +label.api.email =Email +label.api.key =Key +label.api.secret =Secret +label.api.up =Up +label.api.down =Down +label.api.remove =Remove API +label.api.saved =APIs were saved +error.api.ping =API with email {0} does not seem to work correctly +error.api.none.configured =There are no Zoom APIs configured by the sysadmin +error.api.reuse =All configured APIs are in use at the moment. You were assigned a random API. If you decide to start your meeting, another teacher's meeting will be stopped. +sysadmin.maintain= Back to sysadmin - #======= End labels: Exported 64 labels for en AU ===== Index: lams_tool_zoom/db/sql/create_lams_tool_zoom.sql =================================================================== diff -u -rcf892946d1a342e2f00d5e38a67a4251650ac758 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/db/sql/create_lams_tool_zoom.sql (.../create_lams_tool_zoom.sql) (revision cf892946d1a342e2f00d5e38a67a4251650ac758) +++ lams_tool_zoom/db/sql/create_lams_tool_zoom.sql (.../create_lams_tool_zoom.sql) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -37,6 +37,9 @@ CREATE TABLE tl_lazoom10_user ( uid bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20), + email varchar(255), + first_name varchar(255), + last_name varchar(255), finishedActivity bit(1), zoom_session_uid bigint(20), notebook_entry_uid bigint(20), @@ -71,18 +74,4 @@ 0 ); --- hardcoded API keys -INSERT INTO tl_lazoom10_api ( - email, - api_key, - api_secret -) -VALUES ( - 'marcin@cieslak.mail.pl', - '6mJsv7muQaeimMr7t6NlhA', - '10oY1sViuELyZ7QutePK7pIs5acJ1C0zeDuI' -); - --- default configuration values - SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_tool_zoom/db/sql/tool_insert.sql =================================================================== diff -u -r7e6e3f54e13ae88f51988659f2e290d6d902f7b1 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/db/sql/tool_insert.sql (.../tool_insert.sql) (revision 7e6e3f54e13ae88f51988659f2e290d6d902f7b1) +++ lams_tool_zoom/db/sql/tool_insert.sql (.../tool_insert.sql) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -37,7 +37,7 @@ 'tool/lazoom10/authoring.do', 'tool/lazoom10/monitoring.do', 'http://wiki.lamsfoundation.org/display/lamsdocs/lazoom10', -'tool/lazoom10/admin/view.do', +'tool/lazoom10/admin.do', 'org.lamsfoundation.lams.tool.zoom.ApplicationResources', NOW(), NOW() Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/IZoomConfigDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/IZoomSessionDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/IZoomUserDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/hibernate/ZoomConfigDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/hibernate/ZoomSessionDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/dao/hibernate/ZoomUserDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/model/ZoomApi.java =================================================================== diff -u -r2cf1e086b82a29fae22136351fc7a44821181323 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/model/ZoomApi.java (.../ZoomApi.java) (revision 2cf1e086b82a29fae22136351fc7a44821181323) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/model/ZoomApi.java (.../ZoomApi.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -23,6 +23,9 @@ package org.lamsfoundation.lams.tool.zoom.model; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; + /** * */ @@ -46,6 +49,13 @@ this.secret = value; } + public ZoomApi(JSONObject apiJSON) throws JSONException { + this.uid = apiJSON.optLong("uid"); + this.email = apiJSON.getString("email"); + this.key = apiJSON.getString("key"); + this.secret = apiJSON.getString("secret"); + } + /** * */ @@ -77,15 +87,20 @@ this.key = key; } - /** - * - * @return - */ public String getSecret() { return secret; } public void setSecret(String value) { this.secret = value; } + + public JSONObject toJSON() throws JSONException { + JSONObject result = new JSONObject(); + result.put("uid", uid); + result.put("email", email); + result.put("key", key); + result.put("secret", secret); + return result; + } } Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/IZoomService.java =================================================================== diff -u -rcf892946d1a342e2f00d5e38a67a4251650ac758 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/IZoomService.java (.../IZoomService.java) (revision cf892946d1a342e2f00d5e38a67a4251650ac758) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/IZoomService.java (.../IZoomService.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -24,10 +24,12 @@ package org.lamsfoundation.lams.tool.zoom.service; import java.io.IOException; +import java.util.List; import org.apache.tomcat.util.json.JSONException; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.tool.zoom.model.Zoom; +import org.lamsfoundation.lams.tool.zoom.model.ZoomApi; import org.lamsfoundation.lams.tool.zoom.model.ZoomSession; import org.lamsfoundation.lams.tool.zoom.model.ZoomUser; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -129,9 +131,34 @@ void updateNotebookEntry(Long uid, String entry); - boolean chooseApiKeys(Long zoomUid); + /** + * Choose API keys for a new meeting. + * NULL means that there are none available. + * false means that keys have been chosen but they seem to be in use + * true means that keys have been chosen and they seem to be free + */ + Boolean chooseApi(Long zoomUid) throws IOException, JSONException; + /** + * Create a new Zoom meeting using API + * + * @return start URL for browser to call and start the meeting + */ String createMeeting(Long zoomUid) throws IOException, JSONException; + /** + * Register user for a meeting. Use session name in last name if the activity is grouped. + * + * @return personalised join link + */ String registerUser(Long zoomUid, Long userUid, String sessionName) throws IOException, JSONException; + + List getApis(); + + void saveApis(List apis); + + /** + * Checks if given API responds correctly + */ + boolean pingZoomApi(Long uid) throws IOException, JSONException; } \ No newline at end of file Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/ZoomService.java =================================================================== diff -u -rcf892946d1a342e2f00d5e38a67a4251650ac758 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/ZoomService.java (.../ZoomService.java) (revision cf892946d1a342e2f00d5e38a67a4251650ac758) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/service/ZoomService.java (.../ZoomService.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -34,8 +34,11 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.Set; import java.util.SortedMap; import java.util.TimeZone; import java.util.TreeMap; @@ -64,11 +67,7 @@ import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.service.ILamsToolService; -import org.lamsfoundation.lams.tool.zoom.dao.IZoomConfigDAO; import org.lamsfoundation.lams.tool.zoom.dao.IZoomDAO; -import org.lamsfoundation.lams.tool.zoom.dao.IZoomSessionDAO; -import org.lamsfoundation.lams.tool.zoom.dao.IZoomUserDAO; -import org.lamsfoundation.lams.tool.zoom.dto.ZoomUserDTO; import org.lamsfoundation.lams.tool.zoom.model.Zoom; import org.lamsfoundation.lams.tool.zoom.model.ZoomApi; import org.lamsfoundation.lams.tool.zoom.model.ZoomSession; @@ -94,12 +93,6 @@ private IZoomDAO zoomDAO = null; - private IZoomSessionDAO zoomSessionDAO = null; - - private IZoomUserDAO zoomUserDAO = null; - - private IZoomConfigDAO zoomConfigDAO = null; - private ILearnerService learnerService; private ILamsToolService toolService; @@ -124,7 +117,7 @@ // learner starts Zoom zoom = getZoomByContentId(toolContentId); session.setZoom(zoom); - zoomSessionDAO.insertOrUpdate(session); + zoomDAO.insertOrUpdate(session); } @Override @@ -147,7 +140,7 @@ @Override public void removeToolSession(Long toolSessionId) throws DataMissingException, ToolException { - zoomSessionDAO.deleteByProperty(ZoomSession.class, "sessionId", toolSessionId); + zoomDAO.deleteByProperty(ZoomSession.class, "sessionId", toolSessionId); } @Override @@ -248,7 +241,7 @@ user.setNotebookEntryUID(null); } user.setFinishedActivity(false); - zoomUserDAO.update(user); + zoomDAO.update(user); } } } @@ -454,7 +447,7 @@ @Override @SuppressWarnings("unchecked") public ZoomSession getSessionBySessionId(Long toolSessionId) { - List list = zoomSessionDAO.findByProperty(ZoomSession.class, "sessionId", toolSessionId); + List list = zoomDAO.findByProperty(ZoomSession.class, "sessionId", toolSessionId); if (list.isEmpty()) { return null; } else { @@ -468,7 +461,7 @@ Map map = new HashMap(); map.put("userId", userId); map.put("zoomSession.sessionId", toolSessionId); - List list = zoomUserDAO.findByProperties(ZoomUser.class, map); + List list = zoomDAO.findByProperties(ZoomUser.class, map); if (list.isEmpty()) { return null; } else { @@ -479,7 +472,7 @@ @Override @SuppressWarnings("unchecked") public ZoomUser getUserByUID(Long uid) { - List list = zoomUserDAO.findByProperty(ZoomUser.class, "uid", uid); + List list = zoomDAO.findByProperty(ZoomUser.class, "uid", uid); if (list.isEmpty()) { return null; } else { @@ -494,12 +487,12 @@ @Override public void saveOrUpdateZoomSession(ZoomSession zoomSession) { - zoomSessionDAO.insertOrUpdate(zoomSession); + zoomDAO.insertOrUpdate(zoomSession); } @Override public void saveOrUpdateZoomUser(ZoomUser zoomUser) { - zoomUserDAO.insertOrUpdate(zoomUser); + zoomDAO.insertOrUpdate(zoomUser); } @Override @@ -546,22 +539,6 @@ this.zoomToolContentHandler = zoomToolContentHandler; } - public IZoomSessionDAO getZoomSessionDAO() { - return zoomSessionDAO; - } - - public void setZoomSessionDAO(IZoomSessionDAO sessionDAO) { - this.zoomSessionDAO = sessionDAO; - } - - public IZoomConfigDAO getZoomConfigDAO() { - return zoomConfigDAO; - } - - public void setZoomConfigDAO(IZoomConfigDAO zoomConfigDAO) { - this.zoomConfigDAO = zoomConfigDAO; - } - public ILamsToolService getToolService() { return toolService; } @@ -570,14 +547,6 @@ this.toolService = toolService; } - public IZoomUserDAO getZoomUserDAO() { - return zoomUserDAO; - } - - public void setZoomUserDAO(IZoomUserDAO userDAO) { - this.zoomUserDAO = userDAO; - } - public ILearnerService getLearnerService() { return learnerService; } @@ -613,16 +582,31 @@ : ToolCompletionStatus.ACTIVITY_ATTEMPTED, null, null); } - @Override - public boolean chooseApiKeys(Long zoomUid) { + public Boolean chooseApi(Long zoomUid) throws IOException, JSONException { Zoom zoom = (Zoom) zoomDAO.find(Zoom.class, zoomUid); - ZoomApi api = zoom.getApi(); - if (zoom.getApi() == null) { - api = (ZoomApi) zoomDAO.find(ZoomApi.class, 1L); - zoom.setApi(api); - zoomDAO.update(zoom); + List apis = getApis(); + if (apis.isEmpty()) { + return null; } - return true; + ZoomApi chosenApi = null; + for (ZoomApi api : apis) { + String meetingListURL = "users/" + api.getEmail() + "/meetings?type=live"; + HttpURLConnection connection = ZoomService.getZoomConnection(meetingListURL, "GET", null, api); + JSONObject resultJSON = ZoomService.getReponse(connection); + boolean noLiveMeetings = resultJSON != null && resultJSON.getInt("total_records") == 0; + if (noLiveMeetings) { + chosenApi = api; + break; + } + } + boolean result = chosenApi != null; + if (!result) { + Random random = new Random(); + chosenApi = apis.get(random.nextInt(apis.size())); + } + zoom.setApi(chosenApi); + zoomDAO.update(zoom); + return result; } @Override @@ -663,31 +647,77 @@ @Override public String registerUser(Long zoomUid, Long userUid, String sessionName) throws IOException, JSONException { - ZoomUser user = (ZoomUser) zoomUserDAO.find(ZoomUser.class, userUid); + ZoomUser user = (ZoomUser) zoomDAO.find(ZoomUser.class, userUid); if (user.getMeetingJoinUrl() != null) { return user.getMeetingJoinUrl(); } - ZoomUserDTO userDTO = new ZoomUserDTO(user); Zoom zoom = (Zoom) zoomDAO.find(Zoom.class, zoomUid); JSONObject bodyJSON = new JSONObject(); - String lastName = userDTO.getLastName(); + String lastName = user.getLastName(); if (isGroupedActivity(zoom.getToolContentId())) { lastName += " (" + sessionName + ")"; } - bodyJSON.put("email", userDTO.getEmail()).put("first_name", userDTO.getFirstName()).put("last_name", lastName); + bodyJSON.put("email", user.getEmail()).put("first_name", user.getFirstName()).put("last_name", lastName); HttpURLConnection connection = ZoomService.getZoomConnection("meetings/" + zoom.getMeetingId() + "/registrants", "POST", bodyJSON.toString(), zoom.getApi()); JSONObject responseJSON = ZoomService.getReponse(connection); String meetingJoinURL = responseJSON.getString("join_url"); user.setMeetingJoinUrl(meetingJoinURL); - zoomUserDAO.update(user); + zoomDAO.update(user); if (logger.isDebugEnabled()) { logger.debug("Registerd user with UID: " + user.getUid() + " for meeting: " + zoom.getMeetingId()); } return meetingJoinURL; } + @SuppressWarnings("unchecked") + @Override + public List getApis() { + return zoomDAO.findAll(ZoomApi.class); + } + + @Override + public void saveApis(List apis) { + List existingApis = getApis(); + Set delete = new HashSet(); + Set saved = new HashSet(); + for (ZoomApi existingApi : existingApis) { + boolean found = false; + for (ZoomApi api : apis) { + if (existingApi.getEmail().equalsIgnoreCase(api.getEmail())) { + found = true; + saved.add(api.getEmail()); + if (!existingApi.getKey().equals(api.getKey()) + || !existingApi.getSecret().equals(api.getSecret())) { + existingApi.setKey(api.getKey()); + existingApi.setSecret(api.getSecret()); + zoomDAO.update(existingApi); + } + break; + } + } + if (!found) { + delete.add(existingApi.getUid()); + } + } + for (Long uidToDelete : delete) { + zoomDAO.deleteById(ZoomApi.class, uidToDelete); + } + for (ZoomApi api : apis) { + if (!saved.contains(api.getEmail())) { + zoomDAO.insert(api); + } + } + } + + public boolean pingZoomApi(Long uid) throws IOException, JSONException { + ZoomApi api = (ZoomApi) zoomDAO.find(ZoomApi.class, uid); + HttpURLConnection connection = ZoomService.getZoomConnection("users/" + api.getEmail() + "/meetings", "GET", + null, api); + return ZoomService.getReponse(connection) != null; + } + private static String generateJWT(ZoomApi api) { Date expiration = new Date(System.currentTimeMillis() + ZoomConstants.JWT_EXPIRATION_MILISECONDS); return Jwts.builder().setHeaderParam("typ", "JWT").setIssuer(api.getKey()).setExpiration(expiration) @@ -698,18 +728,17 @@ throws IOException { URL url = new URL(ZoomConstants.ZOOM_API_URL + urlSuffix); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestProperty("Authorization", "Bearer " + ZoomService.generateJWT(api)); switch (method) { case "PATCH": ZoomService.setRequestMethod(connection, method); connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestProperty("Authorization", "Bearer " + ZoomService.generateJWT(api)); connection.setDoOutput(true); break; case "POST": + connection.setRequestMethod(method); connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestProperty("Authorization", "Bearer " + ZoomService.generateJWT(api)); connection.setDoOutput(true); - connection.setRequestMethod(method); break; default: connection.setRequestMethod(method); @@ -774,7 +803,7 @@ } if (logger.isDebugEnabled()) { - logger.info("Server response: " + code + " " + connection.getResponseMessage() + " " + response); + logger.debug("Server response: " + code + " " + connection.getResponseMessage() + " " + response); } } finally { connection.disconnect(); Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/AdminAction.java =================================================================== diff -u -rcf892946d1a342e2f00d5e38a67a4251650ac758 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/AdminAction.java (.../AdminAction.java) (revision cf892946d1a342e2f00d5e38a67a4251650ac758) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/AdminAction.java (.../AdminAction.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -23,52 +23,79 @@ package org.lamsfoundation.lams.tool.zoom.web.actions; +import java.util.LinkedList; +import java.util.List; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.apache.struts.actions.MappingDispatchAction; -import org.lamsfoundation.lams.tool.zoom.dto.ConfigDTO; +import org.apache.struts.action.ActionMessage; +import org.apache.struts.action.ActionMessages; +import org.apache.struts.actions.DispatchAction; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONObject; +import org.lamsfoundation.lams.tool.zoom.model.ZoomApi; import org.lamsfoundation.lams.tool.zoom.service.IZoomService; import org.lamsfoundation.lams.tool.zoom.service.ZoomServiceProxy; -import org.lamsfoundation.lams.tool.zoom.util.ZoomConstants; -import org.lamsfoundation.lams.tool.zoom.web.forms.AdminForm; -public class AdminAction extends MappingDispatchAction { +public class AdminAction extends DispatchAction { private IZoomService zoomService; - // private static final Logger logger = Logger.getLogger(AdminAction.class); + private static final Logger logger = Logger.getLogger(AdminAction.class); @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { - // set up zoomService zoomService = ZoomServiceProxy.getZoomService(this.getServlet().getServletContext()); - return super.execute(mapping, form, request, response); } - public ActionForward view(ActionMapping mapping, ActionForm form, HttpServletRequest request, + @Override + public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { - - ConfigDTO configDTO = new ConfigDTO(); - - request.setAttribute(ZoomConstants.ATTR_CONFIG_DTO, configDTO); - return mapping.findForward("view-success"); + List apis = zoomService.getApis(); + JSONArray apisJSON = new JSONArray(); + for (ZoomApi api : apis) { + apisJSON.put(api.toJSON()); + } + request.setAttribute("apis", apisJSON); + return mapping.findForward("success"); } public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { + String apisJSONString = request.getParameter("apisJSON"); + JSONArray apisJSON = new JSONArray(apisJSONString); + List apis = new LinkedList(); + for (int index = 0; index < apisJSON.length(); index++) { + JSONObject apiJSON = apisJSON.getJSONObject(index); + ZoomApi api = new ZoomApi(apiJSON); + apis.add(api); + } + zoomService.saveApis(apis); + request.setAttribute("saveOK", true); + if (logger.isDebugEnabled()) { + logger.debug("Saved " + apis.size() + " Zoom APIs"); + } - if (!isCancelled(request)) { - AdminForm adminForm = (AdminForm) form; - + ActionErrors errors = new ActionErrors(); + apis = zoomService.getApis(); + for (ZoomApi api : apis) { + if (!zoomService.pingZoomApi(api.getUid())) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.api.ping", api.getEmail())); + } } + if (!errors.isEmpty()) { + this.addErrors(request, errors); + } - return mapping.findForward("save-success"); + return unspecified(mapping, form, request, response); } } \ No newline at end of file Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/LearningAction.java =================================================================== diff -u -r1db671237e173c5f999e0bbb6c50e5af0cf7c132 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/LearningAction.java (.../LearningAction.java) (revision 1db671237e173c5f999e0bbb6c50e5af0cf7c132) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/LearningAction.java (.../LearningAction.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -263,23 +263,11 @@ // } else { // } -// String startURL = zoom.getMeetingStartUrl(); -// -// if (zoom.getMeetingId() != null) { -// zoomService.chooseApiKeys(zoom.getUid()); -// startURL = zoomService.createMeeting(zoom.getUid()); -// } - String meetingURL = user.getMeetingJoinUrl(); if (meetingURL == null && zoom.getMeetingId() != null) { meetingURL = zoomService.registerUser(zoom.getUid(), user.getUid(), session.getSessionName()); } -// else { -// meetingURL = startURL; -// zoom.setMeetingStartUrl(null); -// zoomService.saveOrUpdateZoom(zoom); -// } request.setAttribute(ZoomConstants.ATTR_MEETING_URL, meetingURL); return mapping.findForward("zoom"); Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/MonitoringAction.java =================================================================== diff -u -r1db671237e173c5f999e0bbb6c50e5af0cf7c132 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/MonitoringAction.java (.../MonitoringAction.java) (revision 1db671237e173c5f999e0bbb6c50e5af0cf7c132) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/actions/MonitoringAction.java (.../MonitoringAction.java) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -27,9 +27,12 @@ import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; +import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.ActionMessage; +import org.apache.struts.action.ActionMessages; import org.apache.struts.actions.DispatchAction; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.tool.zoom.dto.ContentDTO; @@ -97,7 +100,7 @@ request.setAttribute(ZoomConstants.ATTR_USER_DTO, userDTO); - return mapping.findForward("zoom_display"); + return mapping.findForward("notebook"); } public ActionForward startMeeting(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -111,10 +114,25 @@ request.setAttribute(ZoomConstants.ATTR_CONTENT_DTO, contentDTO); String meetingURL = zoom.getMeetingStartUrl(); + if (meetingURL == null) { - zoomService.chooseApiKeys(zoom.getUid()); - meetingURL = zoomService.createMeeting(zoom.getUid()); + ActionErrors errors = new ActionErrors(); + + Boolean apiOK = zoomService.chooseApi(zoom.getUid()); + if (apiOK == null) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.api.none.configured")); + request.setAttribute("skipContent", true); + } else { + if (!apiOK) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.api.reuse")); + } + meetingURL = zoomService.createMeeting(zoom.getUid()); + } + if (!errors.isEmpty()) { + this.addErrors(request, errors); + } } + request.setAttribute(ZoomConstants.ATTR_MEETING_URL, meetingURL); return mapping.findForward("learning"); Fisheye: Tag 5da86331a25afcff7dfa0dd4647187c5beaa757b refers to a dead (removed) revision in file `lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/web/forms/AdminForm.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/zoomApplicationContext.xml =================================================================== diff -u -r2cf1e086b82a29fae22136351fc7a44821181323 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/zoomApplicationContext.xml (.../zoomApplicationContext.xml) (revision 2cf1e086b82a29fae22136351fc7a44821181323) +++ lams_tool_zoom/src/java/org/lamsfoundation/lams/tool/zoom/zoomApplicationContext.xml (.../zoomApplicationContext.xml) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -19,10 +19,7 @@ - - - @@ -40,6 +37,7 @@ PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED + PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED @@ -53,20 +51,8 @@ - - - - - - - - - - - - Index: lams_tool_zoom/web/WEB-INF/struts-config.xml =================================================================== diff -u -reeaae70bac24a36a5f05a5d56638df29c1a495c5 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision eeaae70bac24a36a5f05a5d56638df29c1a495c5) +++ lams_tool_zoom/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -25,10 +25,6 @@ name="authoringForm" type="org.lamsfoundation.lams.tool.zoom.web.forms.AuthoringForm" /> - @@ -39,9 +35,6 @@ --> - - - @@ -60,8 +53,8 @@ redirect="false" /> - - - - - - - - - - - - - - - - + + + - + \ No newline at end of file Index: lams_tool_zoom/web/WEB-INF/tiles-defs.xml =================================================================== diff -u -r2cf1e086b82a29fae22136351fc7a44821181323 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision 2cf1e086b82a29fae22136351fc7a44821181323) +++ lams_tool_zoom/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -76,7 +76,7 @@ - + @@ -98,17 +98,8 @@ - - - - - - - - - Index: lams_tool_zoom/web/pages/admin/view.jsp =================================================================== diff -u -r2cf1e086b82a29fae22136351fc7a44821181323 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/web/pages/admin/view.jsp (.../view.jsp) (revision 2cf1e086b82a29fae22136351fc7a44821181323) +++ lams_tool_zoom/web/pages/admin/view.jsp (.../view.jsp) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -3,20 +3,131 @@ - - - - - - - - - -
+ + + + + + + +
+
+
+

+ + + + + + + + + +
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + + +
+
+
+
\ No newline at end of file Index: lams_tool_zoom/web/pages/learning/learning.jsp =================================================================== diff -u -reeaae70bac24a36a5f05a5d56638df29c1a495c5 -r5da86331a25afcff7dfa0dd4647187c5beaa757b --- lams_tool_zoom/web/pages/learning/learning.jsp (.../learning.jsp) (revision eeaae70bac24a36a5f05a5d56638df29c1a495c5) +++ lams_tool_zoom/web/pages/learning/learning.jsp (.../learning.jsp) (revision 5da86331a25afcff7dfa0dd4647187c5beaa757b) @@ -14,7 +14,16 @@ -
+ + + + +
+
+
+
+ +

@@ -28,7 +37,7 @@ -

+