Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/model/SurveyUser.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/model/SurveyUser.java,v diff -u -r1.4.14.1 -r1.4.14.2 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/model/SurveyUser.java 29 Oct 2014 19:58:21 -0000 1.4.14.1 +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/model/SurveyUser.java 19 Jun 2015 05:53:06 -0000 1.4.14.2 @@ -73,7 +73,18 @@ this.survey = content; this.responseFinalized = false; } + + public SurveyUser(Long userId, String firstName, String lastName, String login, Survey content) { + this.userId = userId; + this.firstName = firstName; + this.lastName = lastName; + this.loginName = login; + this.session = null; + this.survey = content; + this.responseFinalized = false; + } + /** * Clone method from java.lang.Object */ Index: lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java,v diff -u -r1.37.2.1 -r1.37.2.2 --- lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java 29 Oct 2014 19:58:20 -0000 1.37.2.1 +++ lams_tool_survey/src/java/org/lamsfoundation/lams/tool/survey/service/SurveyServiceImpl.java 19 Jun 2015 05:53:06 -0000 1.37.2.2 @@ -42,6 +42,9 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; @@ -50,6 +53,8 @@ import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; +import org.lamsfoundation.lams.rest.RestTags; +import org.lamsfoundation.lams.rest.ToolRestManager; import org.lamsfoundation.lams.tool.ToolContentImport102Manager; import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutput; @@ -83,6 +88,7 @@ import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.util.wddx.WDDXProcessor; @@ -92,7 +98,7 @@ * @author Dapeng.Ni */ public class SurveyServiceImpl implements ISurveyService, ToolContentManager, ToolSessionManager, - ToolContentImport102Manager { + ToolContentImport102Manager, ToolRestManager { private static Logger log = Logger.getLogger(SurveyServiceImpl.class.getName()); // DAO @@ -672,13 +678,8 @@ SurveyUser user = surveyUserDao .getUserByUserIDAndContentID(new Long(newUserUid.longValue()), toolContentId); if (user == null) { - user = new SurveyUser(); UserDTO sysUser = ((User) userManagementService.findById(User.class, newUserUid)).getUserDTO(); - user.setFirstName(sysUser.getFirstName()); - user.setLastName(sysUser.getLastName()); - user.setLoginName(sysUser.getLogin()); - user.setUserId(new Long(newUserUid.longValue())); - user.setSurvey(toolContentObj); + user = new SurveyUser(sysUser, toolContentObj); } toolContentObj.setCreatedBy(user); @@ -1100,4 +1101,82 @@ public void setSurveyOutputFactory(SurveyOutputFactory surveyOutputFactory) { this.surveyOutputFactory = surveyOutputFactory; } + + // ****************** REST methods ************************* + + /** + * Used by the Rest calls to create content. + * + * Mandatory fields in toolContentJSON: title, instructions, questions. Optional fields are lockWhenFinished + * (default true), showOnePage (default true), notifyTeachersOnAnswerSumbit (default false), showOtherUsersAnswers + * (default false), reflectOnActivity, reflectInstructions, submissionDeadline + * + * Questions must contain a JSONArray of JSONObject objects, which have the following mandatory fields: + * questionText, type (1=one answer,2=multiple answers,3=free text entry) and answers. Answers is a JSONArray of + * strings, which are the answer text. A question may also have the optional fields: allowOtherTextEntry (default + * false), required (default true) + * + * There should be at least one question object in the Questions array and at least one option in the Options array. + */ + @Override + public void createRestToolContent(Integer userID, Long toolContentID, JSONObject toolContentJSON) + throws JSONException { + + Survey survey = new Survey(); + Date updateDate = new Date(); + survey.setCreated(updateDate); + survey.setUpdated(updateDate); + + survey.setContentId(toolContentID); + survey.setTitle(toolContentJSON.getString(RestTags.TITLE)); + survey.setInstructions(toolContentJSON.getString(RestTags.INSTRUCTIONS)); + + survey.setContentInUse(false); + survey.setDefineLater(false); + survey.setLockWhenFinished(JsonUtil.opt(toolContentJSON, RestTags.LOCK_WHEN_FINISHED, Boolean.TRUE)); + survey.setReflectInstructions((String) JsonUtil.opt(toolContentJSON, RestTags.REFLECT_INSTRUCTIONS, null)); + survey.setReflectOnActivity(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); + survey.setNotifyTeachersOnAnswerSumbit(JsonUtil.opt(toolContentJSON, "notifyTeachersOnAnswerSumbit", Boolean.FALSE)); + survey.setShowOnePage(JsonUtil.opt(toolContentJSON, "showOnePage", Boolean.TRUE)); + survey.setShowOtherUsersAnswers(JsonUtil.opt(toolContentJSON, "showOtherUsersAnswers", Boolean.FALSE)); + + // submissionDeadline is set in monitoring + + SurveyUser surveyUser = new SurveyUser(userID.longValue(), toolContentJSON.getString("firstName"), + toolContentJSON.getString("lastName"), toolContentJSON.getString("loginName"), survey); + survey.setCreatedBy(surveyUser); + + // **************************** Handle Survey Questions ********************* + + JSONArray questions = toolContentJSON.getJSONArray(RestTags.QUESTIONS); + for (int i = 0; i < questions.length(); i++) { + JSONObject questionData = (JSONObject) questions.get(i); + SurveyQuestion newQuestion = new SurveyQuestion(); + newQuestion.setCreateBy(surveyUser); + newQuestion.setCreateDate(updateDate); + newQuestion.setDescription(questionData.getString(RestTags.QUESTION_TEXT)); + newQuestion.setType((short) questionData.getInt("type")); + newQuestion.setAppendText(JsonUtil.opt(questionData, "allowOtherTextEntry", Boolean.FALSE)); + Boolean required = JsonUtil.opt(questionData, "required", Boolean.TRUE); + newQuestion.setOptional(!required); + newQuestion.setSequenceId(i + 1); // sequence number starts at 1 + + Set newOptions = new HashSet(); + JSONArray options = questionData.getJSONArray(RestTags.ANSWERS); + for (int j = 0; j < options.length(); j++) { + SurveyOption newOption = new SurveyOption(); + newOption.setDescription(options.getString(j)); + newOption.setSequenceId(j); // sequence number starts at 0 + newOptions.add(newOption); + } + newQuestion.setOptions(newOptions); + + survey.getQuestions().add(newQuestion); + } + + saveOrUpdateSurvey(survey); + // ******************************* + // TODO - investigate conditions + // survey.setConditions(conditions); + } } \ No newline at end of file Index: lams_tool_wiki/src/java/org/lamsfoundation/lams/tool/wiki/service/WikiService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_wiki/src/java/org/lamsfoundation/lams/tool/wiki/service/WikiService.java,v diff -u -r1.25 -r1.25.2.1 --- lams_tool_wiki/src/java/org/lamsfoundation/lams/tool/wiki/service/WikiService.java 6 Jun 2014 16:41:17 -0000 1.25 +++ lams_tool_wiki/src/java/org/lamsfoundation/lams/tool/wiki/service/WikiService.java 19 Jun 2015 06:01:25 -0000 1.25.2.1 @@ -28,13 +28,15 @@ import java.util.Date; import java.util.HashSet; import java.util.Hashtable; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.SortedMap; import org.apache.log4j.Logger; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.learning.service.ILearnerService; @@ -45,6 +47,8 @@ import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.notebook.service.ICoreNotebookService; +import org.lamsfoundation.lams.rest.RestTags; +import org.lamsfoundation.lams.rest.ToolRestManager; import org.lamsfoundation.lams.tool.ToolContentImport102Manager; import org.lamsfoundation.lams.tool.ToolContentManager; import org.lamsfoundation.lams.tool.ToolOutput; @@ -72,6 +76,7 @@ import org.lamsfoundation.lams.tool.wiki.web.forms.WikiPageForm; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; @@ -80,7 +85,7 @@ * * As a requirement, all LAMS tool's service bean must implement ToolContentManager and ToolSessionManager. */ -public class WikiService implements ToolSessionManager, ToolContentManager, IWikiService, ToolContentImport102Manager { +public class WikiService implements ToolSessionManager, ToolContentManager, IWikiService, ToolContentImport102Manager, ToolRestManager { static Logger logger = Logger.getLogger(WikiService.class.getName()); @@ -1013,4 +1018,84 @@ public Class[] getSupportedToolOutputDefinitionClasses(int definitionType) { return getWikiOutputFactory().getSupportedDefinitionClasses(definitionType); } + + /* ****************** REST methods **************************************************************************/ + + /** + * Used by the Rest calls to create content. + * + * Mandatory fields in toolContentJSON: title, instructions, pages. Optional fields reflectInstructions, + * reflectOnActivity, lockWhenFinished (default False), allowLearnerAttachImages (default True), + * allowLearnerCreatePages (default True), allowLearnerInsertLinks (default True) notifyUpdates (default False), + * minimumEdits and maximumEdits (default 0, no min/max) + * + * Pages is a JSONArray of JSONObjects, where each object represents a Wiki page. The first entry in the array + * becomes the main page. Withing the wiki page object, mandatory fields are title and body. Optional field is + * readOnly, which defaults to false (ie the user can edit the page). + */ + @Override + public void createRestToolContent(Integer userID, Long toolContentID, JSONObject toolContentJSON) + throws JSONException { + + Wiki content = new Wiki(); + Date updateDate = new Date(); + content.setCreateDate(updateDate); + content.setUpdateDate(updateDate); + content.setCreateBy(userID.longValue()); + content.setToolContentId(toolContentID); + content.setTitle(toolContentJSON.getString(RestTags.TITLE)); + // No instructions are available in the current wiki implementation + // content.setInstructions(toolContentJSON.getString(RestTags.INSTRUCTIONS)); + + content.setContentInUse(false); + content.setDefineLater(false); + content.setReflectInstructions((String) JsonUtil.opt(toolContentJSON, RestTags.REFLECT_INSTRUCTIONS, null)); + content.setReflectOnActivity(JsonUtil.opt(toolContentJSON, RestTags.REFLECT_ON_ACTIVITY, Boolean.FALSE)); + content.setLockOnFinished(JsonUtil.opt(toolContentJSON, RestTags.LOCK_WHEN_FINISHED, Boolean.FALSE)); + + content.setAllowLearnerAttachImages(JsonUtil.opt(toolContentJSON, "allowLearnerAttachImages", Boolean.TRUE)); + content.setAllowLearnerCreatePages(JsonUtil.opt(toolContentJSON, "allowLearnerCreatePages", Boolean.TRUE)); + content.setAllowLearnerInsertLinks(JsonUtil.opt(toolContentJSON, "allowLearnerInsertLinks", Boolean.TRUE)); + content.setNotifyUpdates(JsonUtil.opt(toolContentJSON, "notifyUpdates", Boolean.FALSE)); + content.setMinimumEdits(JsonUtil.opt(toolContentJSON, "minimumEdits", 0)); + content.setMaximumEdits(JsonUtil.opt(toolContentJSON, "maximumEdits", 0)); + + /* ********************** Handle pages ***************************************************** */ + /* The first page becomes the main page, all other pages saved in the order in the JSONArray */ + boolean firstEntry = true; + content.setWikiPages(new HashSet()); + JSONArray pages = toolContentJSON.getJSONArray("pages"); + for (int i = 0; i < pages.length(); i++) { + JSONObject pageData = (JSONObject) pages.get(i); + + WikiPage wikiPage = new WikiPage(); + Boolean isReadOnly = JsonUtil.opt(pageData, RestTags.READ_ONLY, Boolean.FALSE); + wikiPage.setEditable(!isReadOnly); + wikiPage.setParentWiki(content); + wikiPage.setTitle(pageData.getString(RestTags.TITLE)); + wikiPage.setAddedBy(null); + wikiPage.setWikiContentVersions(new HashSet()); + wikiPage.setWikiSession(null); + + // Create a new wiki page content using the wiki page form + WikiPageContent wikiPageContent = new WikiPageContent(); + wikiPageContent.setBody(pageData.getString("body")); + wikiPageContent.setEditDate(updateDate); + wikiPageContent.setEditor(null); + wikiPageContent.setVersion(new Long(1)); + wikiPageContent.setWikiPage(wikiPage); + + // Apply the content to the wiki page and save + wikiPage.setCurrentWikiContent(wikiPageContent); + wikiPage.getWikiContentVersions().add(wikiPageContent); + if ( firstEntry ) { + content.setMainPage(wikiPage); + firstEntry=false; + } + content.getWikiPages().add(wikiPage); + } + + insertUnsavedWikiContent(content); + // don't set WikiPages, as it is built from the database column wiki_uid in the wiki_page table + } }