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
+ }
}