From 88fcf22280225ce01409d588839af75e2a1822c5 Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Thu, 5 Mar 2015 16:23:21 +0100 Subject: [PATCH] Fix for #14819: Emit socket events on learning progress change --- .../java/de/thm/arsnova/dao/CacheBuster.java | 4 ++ .../domain/LearningProgressFactory.java | 43 +++++++++++++++---- .../events/ChangeLearningProgress.java | 35 +++++++++++++++ .../thm/arsnova/events/NovaEventVisitor.java | 2 + .../arsnova/socket/ARSnovaSocketIOServer.java | 6 +++ 5 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/events/ChangeLearningProgress.java diff --git a/src/main/java/de/thm/arsnova/dao/CacheBuster.java b/src/main/java/de/thm/arsnova/dao/CacheBuster.java index fc00491e..5d39e399 100644 --- a/src/main/java/de/thm/arsnova/dao/CacheBuster.java +++ b/src/main/java/de/thm/arsnova/dao/CacheBuster.java @@ -20,6 +20,7 @@ package de.thm.arsnova.dao; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Component; +import de.thm.arsnova.events.ChangeLearningProgress; import de.thm.arsnova.events.DeleteAllLectureAnswersEvent; import de.thm.arsnova.events.DeleteAllPreparationAnswersEvent; import de.thm.arsnova.events.DeleteAllQuestionsAnswersEvent; @@ -77,4 +78,7 @@ public class CacheBuster implements ICacheBuster, NovaEventVisitor { @Override public void visit(StatusSessionEvent event) {} + + @Override + public void visit(ChangeLearningProgress changeLearningProgress) {} } diff --git a/src/main/java/de/thm/arsnova/domain/LearningProgressFactory.java b/src/main/java/de/thm/arsnova/domain/LearningProgressFactory.java index ab378a46..d2936f57 100644 --- a/src/main/java/de/thm/arsnova/domain/LearningProgressFactory.java +++ b/src/main/java/de/thm/arsnova/domain/LearningProgressFactory.java @@ -19,9 +19,12 @@ package de.thm.arsnova.domain; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.stereotype.Component; import de.thm.arsnova.dao.IDatabaseDao; +import de.thm.arsnova.events.ChangeLearningProgress; import de.thm.arsnova.events.DeleteAllLectureAnswersEvent; import de.thm.arsnova.events.DeleteAllPreparationAnswersEvent; import de.thm.arsnova.events.DeleteAllQuestionsAnswersEvent; @@ -37,11 +40,13 @@ import de.thm.arsnova.events.NovaEventVisitor; import de.thm.arsnova.events.StatusSessionEvent; @Component -public class LearningProgressFactory implements NovaEventVisitor, ILearningProgressFactory { +public class LearningProgressFactory implements NovaEventVisitor, ILearningProgressFactory, ApplicationEventPublisherAware { @Autowired private IDatabaseDao databaseDao; + private ApplicationEventPublisher publisher; + @Override public LearningProgress createFromType(String progressType) { if (progressType.equals("questions")) { @@ -59,31 +64,45 @@ public class LearningProgressFactory implements NovaEventVisitor, ILearningProgr @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(NewQuestionEvent event) {} + public void visit(NewQuestionEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(NewAnswerEvent event) {} + public void visit(NewAnswerEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(DeleteAnswerEvent event) {} + public void visit(DeleteAnswerEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(DeleteQuestionEvent event) {} + public void visit(DeleteQuestionEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(DeleteAllQuestionsAnswersEvent event) {} + public void visit(DeleteAllQuestionsAnswersEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(DeleteAllPreparationAnswersEvent event) {} + public void visit(DeleteAllPreparationAnswersEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @CacheEvict(value = "learningprogress", key = "#event.Session") @Override - public void visit(DeleteAllLectureAnswersEvent event) {} + public void visit(DeleteAllLectureAnswersEvent event) { + this.publisher.publishEvent(new ChangeLearningProgress(this, event.getSession())); + } @Override public void visit(NewFeedbackEvent newFeedbackEvent) {} @@ -94,4 +113,12 @@ public class LearningProgressFactory implements NovaEventVisitor, ILearningProgr @Override public void visit(StatusSessionEvent statusSessionEvent) {} + @Override + public void visit(ChangeLearningProgress changeLearningProgress) {} + + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { + this.publisher = publisher; + } + } diff --git a/src/main/java/de/thm/arsnova/events/ChangeLearningProgress.java b/src/main/java/de/thm/arsnova/events/ChangeLearningProgress.java new file mode 100644 index 00000000..f0ddec67 --- /dev/null +++ b/src/main/java/de/thm/arsnova/events/ChangeLearningProgress.java @@ -0,0 +1,35 @@ +/* + * 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.events; + +import de.thm.arsnova.entities.Session; + +public class ChangeLearningProgress extends SessionEvent { + + private static final long serialVersionUID = 1L; + + public ChangeLearningProgress(Object source, Session session) { + super(source, session); + } + + @Override + public void accept(NovaEventVisitor visitor) { + visitor.visit(this); + } + +} diff --git a/src/main/java/de/thm/arsnova/events/NovaEventVisitor.java b/src/main/java/de/thm/arsnova/events/NovaEventVisitor.java index ab820bf2..c1eb3e68 100644 --- a/src/main/java/de/thm/arsnova/events/NovaEventVisitor.java +++ b/src/main/java/de/thm/arsnova/events/NovaEventVisitor.java @@ -43,4 +43,6 @@ public interface NovaEventVisitor { void visit(StatusSessionEvent statusSessionEvent); + void visit(ChangeLearningProgress changeLearningProgress); + } diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index e68d9917..f8d7b6a5 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -49,6 +49,7 @@ import com.corundumstudio.socketio.protocol.PacketType; import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.User; import de.thm.arsnova.entities.transport.LearningProgressType; +import de.thm.arsnova.events.ChangeLearningProgress; import de.thm.arsnova.events.DeleteAllLectureAnswersEvent; import de.thm.arsnova.events.DeleteAllPreparationAnswersEvent; import de.thm.arsnova.events.DeleteAllQuestionsAnswersEvent; @@ -518,4 +519,9 @@ public class ARSnovaSocketIOServer implements ARSnovaSocket, NovaEventVisitor { public void visit(StatusSessionEvent event) { this.reportSessionStatus(event.getSession().getKeyword(), event.getSession().isActive()); } + + @Override + public void visit(ChangeLearningProgress event) { + broadcastInSession(event.getSession().getKeyword(), "learningProgressChange", null); + } } -- GitLab