diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 1ae11a81bfde4abc0cd8dc5d9642cb7fa339c60a..a1b25aa68c6ef4c6a5911962a04c58db8701fd7c 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -211,7 +211,7 @@ public class SessionController extends AbstractController { } @RequestMapping(value = "/import", method = RequestMethod.POST) - public final List<SessionInfo> importSession( + public final SessionInfo importSession( @RequestBody final ImportExportSession session, final HttpServletResponse response ) { diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index c2decaacf287bfcb42d8ba796c31d7b7c52e72a8..e8b47c730087008dfe5114e9693975112c1eccf9 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -1696,13 +1696,17 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public List<SessionInfo> importSession(User user, Session s, ImportExportSession importSession) { - final Session session = this.saveSession(user, s); + public SessionInfo importSession(User user, ImportExportSession importSession) { + final Session session = this.saveSession(user, importSession.generateSessionEntity(user)); List<Document> questions = new ArrayList<Document>(); // We need to remember which answers belong to which question. // The answers need a questionId, so we first store the questions to get the IDs. // Then we update the answer objects and store them as well. Map<Document, ImportExportQuestion> mapping = new HashMap<Document, ImportExportQuestion>(); + // Later, generate all answer documents + List<Document> answers = new ArrayList<Document>(); + // We can then push answers together with interposed questions in one large bulk request + List<Document> interposedQuestions = new ArrayList<Document>(); try { // add session id to all questions and generate documents for (ImportExportQuestion question : importSession.getQuestions()) { @@ -1712,12 +1716,8 @@ public class CouchDBDao implements IDatabaseDao { mapping.put(doc, question); } database.bulkSaveDocuments(questions.toArray(new Document[questions.size()])); - } catch (final IOException e) { - LOGGER.error("Could not bulk save all questions: {}", e.getMessage()); - } - // now bulk import all answers - List<Document> answers = new ArrayList<Document>(); - try { + + // bulk import answers together with interposed questions for (Entry<Document, ImportExportQuestion> entry : mapping.entrySet()) { final Document doc = entry.getKey(); final ImportExportQuestion question = entry.getValue(); @@ -1739,10 +1739,46 @@ public class CouchDBDao implements IDatabaseDao { answers.add(answerDoc); } } - database.bulkSaveDocuments(answers.toArray(new Document[answers.size()])); + for (de.thm.arsnova.entities.transport.InterposedQuestion i : importSession.getFeedbackQuestions()) { + final Document q = new Document(); + q.put("type", "interposed_question"); + q.put("sessionId", session.get_id()); + q.put("subject", i.getSubject()); + q.put("text", i.getText()); + q.put("timestamp", i.getTimestamp()); + q.put("read", i.isRead()); + // we do not store the creator's name + q.put("creator", ""); + interposedQuestions.add(q); + } + List<Document> documents = new ArrayList<Document>(answers); + documents.addAll(interposedQuestions); + database.bulkSaveDocuments(documents.toArray(new Document[documents.size()])); } catch (IOException e) { - LOGGER.error("Could not bulk save all answers: {}", e.getMessage()); + LOGGER.error("Could not import this session: {}", e.getMessage()); + // Something went wrong, delete this session since we do not want a partial import + this.deleteSession(session); + return null; } - return null; + // Calculate some statistics... + int unreadInterposed = 0; + for (de.thm.arsnova.entities.transport.InterposedQuestion i : importSession.getFeedbackQuestions()) { + if (!i.isRead()) { + unreadInterposed++; + } + } + int numUnanswered = 0; + for (ImportExportQuestion question : importSession.getQuestions()) { + if (question.getAnswers().size() == 0) { + numUnanswered++; + } + } + final SessionInfo info = new SessionInfo(session); + info.setNumQuestions(questions.size()); + info.setNumUnanswered(numUnanswered); + info.setNumAnswers(answers.size()); + info.setNumInterposed(interposedQuestions.size()); + info.setNumUnredInterposed(unreadInterposed); + return info; } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index f08c1bc97d676b722fe6cb48d910caa697f67853..6f534be9401c6180e7c508e3f2db3c0f809e7975 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -187,5 +187,5 @@ public interface IDatabaseDao { void deleteAllLectureAnswers(Session session); - List<SessionInfo> importSession(User user, Session session, ImportExportSession importSession); + SessionInfo importSession(User user, ImportExportSession importSession); } diff --git a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java index 76feb0b7603e7dc7e06077a50715182642205172..8021e93ac46b2f1c538e849414a40c91bf7aab2a 100644 --- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java +++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java @@ -1,9 +1,25 @@ +/* + * This file is part of ARSnova Backend. + * Copyright (C) 2012-2015 The ARSnova Team + * + * ARSnova Backend 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 Backend 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.transport; import java.util.Date; import java.util.List; -import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index da8106e10d50c9c8cea45f500ec1f1dc9f3762e3..a65413aad83d0860a34d0eac85ec45e6901ee199 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -63,5 +63,5 @@ public interface ISessionService { List<SessionInfo> getMyVisitedSessionsInfo(); - List<SessionInfo> importSession(ImportExportSession session); + SessionInfo importSession(ImportExportSession session); } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 1e8f5dbc9d5c252ca5f17c05b4e4692eaa919cf2..0a25029c67900b8edf27021ffb7c66c23bafab57 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -301,9 +301,12 @@ public class SessionService implements ISessionService { @Override @PreAuthorize("isAuthenticated()") - public List<SessionInfo> importSession(ImportExportSession importSession) { + public SessionInfo importSession(ImportExportSession importSession) { final User user = userService.getCurrentUser(); - final Session session = importSession.generateSessionEntity(user); - return databaseDao.importSession(user, session, importSession); + final SessionInfo info = databaseDao.importSession(user, importSession); + if (info == null) { + throw new RuntimeException("Error while importing the session."); + } + return info; } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 6c9cb35b67647cf7dde3d9c3e96fc7e53fe0c028..d9ce9195a221128da561b562e8f36b999438b656 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -576,7 +576,7 @@ public class StubDatabaseDao implements IDatabaseDao { } @Override - public List<SessionInfo> importSession(User user, Session session, ImportExportSession importSession) { + public SessionInfo importSession(User user, ImportExportSession importSession) { // TODO Auto-generated method stub return null; }