Index: lams_build/conf/whiteboard/readme.txt =================================================================== diff -u -rd1b5adfc103345fa2525236c53313dcda1cfb7c0 -rcf53a39fbd08dd3125cceba14221ac809ae6df13 --- lams_build/conf/whiteboard/readme.txt (.../readme.txt) (revision d1b5adfc103345fa2525236c53313dcda1cfb7c0) +++ lams_build/conf/whiteboard/readme.txt (.../readme.txt) (revision cf53a39fbd08dd3125cceba14221ac809ae6df13) @@ -14,6 +14,7 @@ 3.2 In server.js we set up default port to 9003 instead of 8080, so it does not collide with WildFly development mode. 3.3 In server-backend.js we introduce hashing of wid + accesstoken to improve security. - Also an API method is added to copy Whiteboard canvas on tool content copy. + Also an API method is added to upload Whiteboard canvas content after tool content import + and a method to copy Whiteboard canvas on tool content copy. - 3.4 In s_whiteboard.js we introduce methods for copying canvas contents. \ No newline at end of file + 3.4 In s_whiteboard.js we introduce methods for copying and saving canvas contents. \ No newline at end of file Index: lams_build/conf/whiteboard/scripts/s_whiteboard.js =================================================================== diff -u -rd1b5adfc103345fa2525236c53313dcda1cfb7c0 -rcf53a39fbd08dd3125cceba14221ac809ae6df13 --- lams_build/conf/whiteboard/scripts/s_whiteboard.js (.../s_whiteboard.js) (revision d1b5adfc103345fa2525236c53313dcda1cfb7c0) +++ lams_build/conf/whiteboard/scripts/s_whiteboard.js (.../s_whiteboard.js) (revision cf53a39fbd08dd3125cceba14221ac809ae6df13) @@ -136,5 +136,14 @@ return; } savedBoards[targetWid] = sourceData.slice(); + this.saveToDB(); + }, + saveData: function(wid, data) { + const existingData = this.loadStoredData(wid); + if (existingData.lenght > 0 || !data) { + return; + } + savedBoards[wid] = JSON.parse(data); + this.saveToDB(); } }; Index: lams_build/conf/whiteboard/scripts/server-backend.js =================================================================== diff -u -rf6b80caa959ab108bebf5c686ae7401d4fe42943 -rcf53a39fbd08dd3125cceba14221ac809ae6df13 --- lams_build/conf/whiteboard/scripts/server-backend.js (.../server-backend.js) (revision f6b80caa959ab108bebf5c686ae7401d4fe42943) +++ lams_build/conf/whiteboard/scripts/server-backend.js (.../server-backend.js) (revision cf53a39fbd08dd3125cceba14221ac809ae6df13) @@ -93,7 +93,34 @@ } }); + // added by LAMS + app.post("/api/uploadwhiteboard", function (req, res) { + var form = new formidable.IncomingForm(); //Receive form + var formData = { + fields: {}, + }; + form.on("field", function (name, value) { + formData["fields"][name] = value; + }); + + form.on("error", function (err) { + console.log("File upload Error!"); + }); + + form.on("end", function () { + if (accessToken === "" || hashAccessToken(formData["fields"]["wid"]) == formData["fields"]["at"]) { + s_whiteboard.saveData(formData["fields"]["wid"], formData["fields"]["content"]); + res.end(); + } else { + res.status(401); //Unauthorized + res.end(); + } + //End file upload + }); + form.parse(req); + }); + /** * @api {get} /api/getReadOnlyWid Get the readOnlyWhiteboardId * @apiDescription This returns the readOnlyWhiteboardId for a given WhiteboardId Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/model/Whiteboard.java =================================================================== diff -u -rd1b5adfc103345fa2525236c53313dcda1cfb7c0 -rcf53a39fbd08dd3125cceba14221ac809ae6df13 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/model/Whiteboard.java (.../Whiteboard.java) (revision d1b5adfc103345fa2525236c53313dcda1cfb7c0) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/model/Whiteboard.java (.../Whiteboard.java) (revision cf53a39fbd08dd3125cceba14221ac809ae6df13) @@ -41,6 +41,7 @@ import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.Table; +import javax.persistence.Transient; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; @@ -124,6 +125,10 @@ @JoinColumn(name = "create_by") private WhiteboardUser createdBy; + // used only for export and import of LD + @Transient + private String exportContent; + // ********************************************************** // Function method for Whiteboard // ********************************************************** @@ -390,4 +395,12 @@ public void setGalleryWalkInstructions(String galleryWalkInstructions) { this.galleryWalkInstructions = galleryWalkInstructions; } + + public String getExportContent() { + return exportContent; + } + + public void setExportContent(String exportContent) { + this.exportContent = exportContent; + } } \ No newline at end of file Index: lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java =================================================================== diff -u -rd1b5adfc103345fa2525236c53313dcda1cfb7c0 -rcf53a39fbd08dd3125cceba14221ac809ae6df13 --- lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision d1b5adfc103345fa2525236c53313dcda1cfb7c0) +++ lams_tool_whiteboard/src/java/org/lamsfoundation/lams/tool/whiteboard/service/WhiteboardService.java (.../WhiteboardService.java) (revision cf53a39fbd08dd3125cceba14221ac809ae6df13) @@ -25,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; @@ -589,7 +590,7 @@ if (StringUtils.isBlank(sourceWid) || StringUtils.isBlank(targetWid)) { return; } - // using Whiteboard API from https://cloud13.de/testwhiteboard/apidoc/index.html + // using own method added to Whiteboard API String whiteboardServerUrl = getWhiteboardServerUrl(); StringBuilder url = new StringBuilder().append(whiteboardServerUrl).append("/api/copywhiteboard?sourceWid=") .append(sourceWid).append("&targetWid=").append(targetWid); @@ -612,6 +613,78 @@ } } + private void uploadWhiteboardContent(String wid, String content) throws WhiteboardApplicationException { + if (StringUtils.isBlank(wid) || StringUtils.isBlank(content)) { + return; + } + // using own method added to Whiteboard API + String whiteboardServerUrl = getWhiteboardServerUrl(); + StringBuilder url = new StringBuilder().append(whiteboardServerUrl).append("/api/uploadwhiteboard"); + + StringBuilder parameters = new StringBuilder("wid=").append(wid); + String whiteboardAccessToken = getWhiteboardAccessTokenHash(wid, null); + if (whiteboardAccessToken != null) { + parameters.append("&at=").append(whiteboardAccessToken); + } + parameters.append("&content=").append(content); + + try { + HttpURLConnection connection = HttpUrlConnectionUtil.getConnection(url.toString()); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setRequestProperty("charset", "utf-8"); + connection.setDoOutput(true); + + OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); + writer.write(parameters.toString()); + writer.close(); + + connection.connect(); + int code = connection.getResponseCode(); + if (code != 200) { + throw new IOException( + "When uploading Whiteboard content to ID " + wid + " server responded with code " + code); + } + } catch (IOException e) { + throw new WhiteboardApplicationException("Could not upload Whiteboard content to ID " + wid, e); + } + } + + private String getWhiteboardContent(String wid) throws WhiteboardApplicationException { + if (StringUtils.isBlank(wid)) { + return null; + } + // using Whiteboard API from https://cloud13.de/testwhiteboard/apidoc/index.html + String whiteboardServerUrl = getWhiteboardServerUrl(); + StringBuilder url = new StringBuilder().append(whiteboardServerUrl).append("/api/loadwhiteboard?wid=") + .append(wid); + String whiteboardAccessToken = getWhiteboardAccessTokenHash(wid, null); + if (whiteboardAccessToken != null) { + url.append("&at=").append(whiteboardAccessToken); + } + + try { + HttpURLConnection connection = HttpUrlConnectionUtil.getConnection(url.toString()); + connection.connect(); + int code = connection.getResponseCode(); + if (code != 200) { + throw new IOException( + "When getting Whiteboard content with ID " + wid + ", server responded with code " + code); + } + + InputStream responseStream = connection.getInputStream(); + if (responseStream != null) { + StringWriter writer = new StringWriter(); + IOUtils.copy(responseStream, writer, Charset.defaultCharset()); + return writer.toString(); + } + } catch (IOException e) { + throw new WhiteboardApplicationException("Could not get Whiteboard content with ID " + wid, e); + } + + return null; + } + public static String getWhiteboardAuthorName(UserDTO user) throws UnsupportedEncodingException { if (user == null) { return null; @@ -685,9 +758,10 @@ // set tool content handler as null to avoid copy file node in repository again. toolContentObj = Whiteboard.newInstance(toolContentObj, toolContentId); try { + toolContentObj.setExportContent(getWhiteboardContent(toolContentId.toString())); exportContentService.exportToolContent(toolContentId, toolContentObj, whiteboardToolContentHandler, rootPath); - } catch (ExportToolContentException e) { + } catch (ExportToolContentException | WhiteboardApplicationException e) { throw new ToolException(e); } } @@ -719,8 +793,12 @@ } toolContentObj.setCreatedBy(user); + if (StringUtils.isNotBlank(toolContentObj.getExportContent())) { + uploadWhiteboardContent(toolContentId.toString(), toolContentObj.getExportContent()); + } + whiteboardDao.insertOrUpdate(toolContentObj); - } catch (ImportToolContentException e) { + } catch (ImportToolContentException | WhiteboardApplicationException e) { throw new ToolException(e); } }