From 9040673efa26a740de1dd67292e7702e548a0264 Mon Sep 17 00:00:00 2001 From: Jan Kammer <jan.kammer@mni.thm.de> Date: Wed, 28 Nov 2012 16:24:26 +0100 Subject: [PATCH] functionality for interposed questions --- .../controller/QuestionController.java | 25 +++++- .../java/de/thm/arsnova/dao/CouchDBDao.java | 33 ++++++-- .../java/de/thm/arsnova/dao/IDatabaseDao.java | 6 +- .../arsnova/entities/InterposedQuestion.java | 83 +++++++++++++++++++ .../arsnova/services/IQuestionService.java | 6 +- .../thm/arsnova/services/QuestionService.java | 11 ++- 6 files changed, 154 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/entities/InterposedQuestion.java diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java index 64074fa7e..e96e332c3 100644 --- a/src/main/java/de/thm/arsnova/controller/QuestionController.java +++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java @@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.Question; import de.thm.arsnova.exceptions.NotFoundException; import de.thm.arsnova.services.IQuestionService; @@ -261,11 +262,33 @@ public class QuestionController extends AbstractController { @RequestMapping(value = "/session/{sessionKey}/interposed", method = RequestMethod.GET) @ResponseBody - public final List<Question> getInterposedQuestions( + public final List<InterposedQuestion> getInterposedQuestions( @PathVariable final String sessionKey, final HttpServletResponse response ) { return questionService.getInterposedQuestions(sessionKey); } + + + @RequestMapping(value = "/session/{sessionkey}/interposed", method = RequestMethod.POST) + @ResponseBody + public final void postInterposedQuestion( + @PathVariable final String sessionkey, + @RequestBody final InterposedQuestion question, + final HttpServletResponse response + ) { + if (!sessionkey.equals(question.getSession())) { + response.setStatus(HttpStatus.PRECONDITION_FAILED.value()); + return; + } + + if (questionService.saveQuestion(question)) { + response.setStatus(HttpStatus.CREATED.value()); + return; + } + + response.setStatus(HttpStatus.BAD_REQUEST.value()); + return; + } } diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index a3f692b3d..5c2652aae 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -57,6 +57,7 @@ import com.fourspaces.couchdb.ViewResults; import de.thm.arsnova.entities.Answer; import de.thm.arsnova.entities.Feedback; import de.thm.arsnova.entities.FoodVote; +import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.LoggedIn; import de.thm.arsnova.entities.PossibleAnswer; import de.thm.arsnova.entities.Question; @@ -541,11 +542,30 @@ public class CouchDBDao implements IDatabaseDao { q.put("noCorrect", question.isNoCorrect()); try { database.saveDocument(q); + return true; } catch (IOException e) { LOGGER.error("Could not save question {}", question); } return false; } + + @Override + public final boolean saveQuestion(final Session session, final InterposedQuestion question) { + Document q = new Document(); + q.put("type", "interposed_question"); + q.put("sessionId", session.get_id()); + q.put("subject", question.getSubject()); + q.put("text", question.getText()); + q.put("timestamp", System.currentTimeMillis()); + q.put("read", false); + try { + database.saveDocument(q); + return true; + } catch (IOException e) { + LOGGER.error("Could not save interposed question {}", question); + } + return false; + } @Override public final Question getQuestion(final String id, final String sessionKey) { @@ -1020,7 +1040,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public List<Question> getInterposedQuestions(String sessionKey) { + public List<InterposedQuestion> getInterposedQuestions(String sessionKey) { Session s = this.getSessionFromKeyword(sessionKey); if (s == null) { throw new NotFoundException(); @@ -1033,14 +1053,15 @@ public class CouchDBDao implements IDatabaseDao { if (questions == null || questions.isEmpty()) { return null; } - List<Question> result = new ArrayList<Question>(); + List<InterposedQuestion> result = new ArrayList<InterposedQuestion>(); + LOGGER.debug("{}", questions.getResults()); for (Document document : questions.getResults()) { - Question question = (Question) JSONObject.toBean( + InterposedQuestion question = (InterposedQuestion) JSONObject.toBean( document.getJSONObject().getJSONObject("value"), - Question.class + InterposedQuestion.class ); - question.setQuestionType("interposed_question"); - question.setSession(s.get_id()); + question.setSession(sessionKey); + question.set_id(document.getId()); result.add(question); } return result; diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 0f53ed9e7..374fe7170 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -24,6 +24,7 @@ import java.util.List; import de.thm.arsnova.entities.Answer; import de.thm.arsnova.entities.Feedback; import de.thm.arsnova.entities.FoodVote; +import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.LoggedIn; import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; @@ -47,6 +48,8 @@ public interface IDatabaseDao { boolean sessionKeyAvailable(String keyword); boolean saveQuestion(Session session, Question question); + + boolean saveQuestion(Session session, InterposedQuestion question); Question getQuestion(String id, String sessionKey); @@ -84,7 +87,7 @@ public interface IDatabaseDao { int getInterposedCount(String sessionKey); - List<Question> getInterposedQuestions(String sessionKey); + List<InterposedQuestion> getInterposedQuestions(String sessionKey); void vote(String menu); @@ -101,4 +104,5 @@ public interface IDatabaseDao { int countAnswers(); int countQuestions(); + } diff --git a/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java new file mode 100644 index 000000000..477cf799b --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2012 THM webMedia + * + * This file is part of ARSnova. + * + * ARSnova is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ARSnova 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, see <http://www.gnu.org/licenses/>. + */ + + +package de.thm.arsnova.entities; + +public class InterposedQuestion { + + private String _id; + private String _rev; + private String type; + private String subject; + private String text; + private String session; + private long timestamp; + private boolean read; + + public String get_id() { + return _id; + } + public void set_id(String _id) { + this._id = _id; + } + public String get_rev() { + return _rev; + } + public void set_rev(String _rev) { + this._rev = _rev; + } + public boolean isRead() { + return read; + } + public void setRead(boolean read) { + this.read = read; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getSubject() { + return subject; + } + public void setSubject(String subject) { + this.subject = subject; + } + public String getText() { + return text; + } + public void setText(String text) { + this.text = text; + } + public String getSession() { + return session; + } + public void setSession(String session) { + this.session = session; + } + public long getTimestamp() { + return timestamp; + } + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + +} diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java index 1ca5ccdcb..7b9ce1fb3 100644 --- a/src/main/java/de/thm/arsnova/services/IQuestionService.java +++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java @@ -22,10 +22,13 @@ package de.thm.arsnova.services; import java.util.List; import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.Question; public interface IQuestionService { boolean saveQuestion(Question question); + + boolean saveQuestion(InterposedQuestion question); Question getQuestion(String id, String sessionkey); @@ -53,5 +56,6 @@ public interface IQuestionService { int getInterposedCount(String sessionKey); - List<Question> getInterposedQuestions(String sessionKey); + List<InterposedQuestion> getInterposedQuestions(String sessionKey); + } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index a4fb8275b..879180c78 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; import de.thm.arsnova.annotation.Authenticated; import de.thm.arsnova.dao.IDatabaseDao; import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; import de.thm.arsnova.exceptions.NoContentException; @@ -64,6 +65,14 @@ public class QuestionService implements IQuestionService { return this.databaseDao.saveQuestion(session, question); } + @Override + @Authenticated + public boolean saveQuestion(InterposedQuestion question) { + Session session = this.databaseDao.getSessionFromKeyword(question.getSession()); + return this.databaseDao.saveQuestion(session, question); + } + + @Override @Authenticated public Question getQuestion(String id, String sessionKey) { @@ -133,7 +142,7 @@ public class QuestionService implements IQuestionService { @Override @Authenticated - public List<Question> getInterposedQuestions(String sessionKey) { + public List<InterposedQuestion> getInterposedQuestions(String sessionKey) { return databaseDao.getInterposedQuestions(sessionKey); } } -- GitLab