diff --git a/src/main/java/de/thm/arsnova/cache/CacheBuster.java b/src/main/java/de/thm/arsnova/cache/CacheBuster.java index ed10194b5af93aab7b8928daf0f32710cd9b14bf..8a3d9fce334bbee10a51cb9171541775a3595e30 100644 --- a/src/main/java/de/thm/arsnova/cache/CacheBuster.java +++ b/src/main/java/de/thm/arsnova/cache/CacheBuster.java @@ -80,7 +80,7 @@ public class CacheBuster implements ICacheBuster, NovaEventVisitor { @Override public void visit(LockQuestionsEvent lockQuestionsEvent) {} - @CacheEvict(value = "answers", key = "#event.Session") + @CacheEvict(value = "answers", key = "#event.Question") @Override public void visit(NewAnswerEvent event) {} diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 00b4b07132ca04fe671d4c8e965aa5a8b55610c0..374d9705a5f1a7a3dcf0ee583937a52ad12d8a12 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -39,6 +39,7 @@ import net.sf.json.util.JSONUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; @@ -117,6 +118,16 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware sessionService = service; } + /** + * Allows access to the proxy object. It has to be used instead of <code>this</code> for local calls to public + * methods for caching purposes. This is an ugly but necessary temporary workaround until a better solution is + * implemented (e.g. use of AspectJ's weaving). + * @return the proxy for CouchDBDao + */ + private IDatabaseDao getDatabaseDao() { + return (IDatabaseDao) AopContext.currentProxy(); + } + @Override public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { this.publisher = publisher; @@ -870,7 +881,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware } view.setGroup(true); final ViewResults results = getDatabase().view(view); - final int abstentionCount = getAbstentionAnswerCount(questionId); + final int abstentionCount = getDatabaseDao().getAbstentionAnswerCount(questionId); final List<Answer> answers = new ArrayList<Answer>(); for (final Document d : results.getResults()) { @@ -894,7 +905,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware view.setEndKeyArray(questionId, "{}"); view.setGroup(true); final ViewResults results = getDatabase().view(view); - final int abstentionCount = getAbstentionAnswerCount(questionId); + final int abstentionCount = getDatabaseDao().getAbstentionAnswerCount(questionId); final List<Answer> answers = new ArrayList<Answer>(); for (final Document d : results.getResults()) { @@ -998,7 +1009,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public int getTotalAnswerCount(final String sessionKey) { - final Session s = getSessionFromKeyword(sessionKey); + final Session s = getDatabaseDao().getSessionFromKeyword(sessionKey); if (s == null) { throw new NotFoundException(); } @@ -1014,7 +1025,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public int getInterposedCount(final String sessionKey) { - final Session s = getSessionFromKeyword(sessionKey); + final Session s = getDatabaseDao().getSessionFromKeyword(sessionKey); if (s == null) { throw new NotFoundException(); } @@ -1247,7 +1258,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware final List<Session> filteredSessions = new ArrayList<Session>(); for (final Session s : allSessions) { try { - final Session session = getSessionFromKeyword(s.getKeyword()); + final Session session = getDatabaseDao().getSessionFromKeyword(s.getKeyword()); if (session != null && !session.isCreator(user)) { result.add(session); } else { @@ -1619,14 +1630,14 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware public List<String> getUnAnsweredLectureQuestionIds(final Session session, final User user) { final NovaView view = new NovaView("answer/variant_by_user_and_piround"); view.setKey(user.getUsername(), session.get_id(), "lecture"); - return collectUnansweredQuestionIdsByPiRound(getLectureQuestionsForUsers(session), view); + return collectUnansweredQuestionIdsByPiRound(getDatabaseDao().getLectureQuestionsForUsers(session), view); } @Override public List<String> getUnAnsweredPreparationQuestionIds(final Session session, final User user) { final NovaView view = new NovaView("answer/variant_by_user_and_piround"); view.setKey(user.getUsername(), session.get_id(), "preparation"); - return collectUnansweredQuestionIdsByPiRound(getPreparationQuestionsForUsers(session), view); + return collectUnansweredQuestionIdsByPiRound(getDatabaseDao().getPreparationQuestionsForUsers(session), view); } private List<String> collectUnansweredQuestionIds( @@ -1716,7 +1727,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<Question> publishAllQuestions(final Session session, final boolean publish) { final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); - publishQuestions(session, publish, questions); + getDatabaseDao().publishQuestions(session, publish, questions); return questions; } @@ -1747,7 +1758,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public List<Question> setVotingAdmissionForAllQuestions(final Session session, final boolean disableVoting) { final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); - setVotingAdmissions(session, disableVoting, questions); + getDatabaseDao().setVotingAdmissions(session, disableVoting, questions); return questions; } @@ -1783,7 +1794,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public void deleteAllQuestionsAnswers(final Session session) { final List<Question> questions = getQuestions(new NovaView("skill_question/by_session"), session); - resetQuestionsRoundState(session, questions); + getDatabaseDao().resetQuestionsRoundState(session, questions); deleteAllAnswersForQuestions(questions); } @@ -1792,7 +1803,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public void deleteAllPreparationAnswers(final Session session) { final List<Question> questions = getQuestions(new NovaView("skill_question/preparation_question_by_session"), session); - resetQuestionsRoundState(session, questions); + getDatabaseDao().resetQuestionsRoundState(session, questions); deleteAllAnswersForQuestions(questions); } @@ -1801,7 +1812,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public void deleteAllLectureAnswers(final Session session) { final List<Question> questions = getQuestions(new NovaView("skill_question/lecture_question_by_session"), session); - resetQuestionsRoundState(session, questions); + getDatabaseDao().resetQuestionsRoundState(session, questions); deleteAllAnswersForQuestions(questions); } @@ -2178,7 +2189,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware @Override public SortOrder createOrUpdateSortOrder(SortOrder sortOrder) { try { - SortOrder oldSortOrder = getSortOrder(sortOrder.getSessionId(), sortOrder.getQuestionVariant(), sortOrder.getSubject()); + SortOrder oldSortOrder = getDatabaseDao().getSortOrder(sortOrder.getSessionId(), sortOrder.getQuestionVariant(), sortOrder.getSubject()); Document d = new Document(); String id = ""; diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml index 98521a822aea86acbc3df072aa07e9d567997218..81bf547b3078968e4ac5e44279f16113b24dbf01 100644 --- a/src/main/webapp/WEB-INF/spring/spring-main.xml +++ b/src/main/webapp/WEB-INF/spring/spring-main.xml @@ -29,7 +29,12 @@ <task:annotation-driven /> - <aop:aspectj-autoproxy> + <!-- + expose-proxy is needed to access the proxy object via AopContext.currentProxy() in CouchDBDao. It might have a + negative impact on performance but is needed for caching until a better solution is implemented (e.g. use of + AspectJ's weaving). + --> + <aop:aspectj-autoproxy expose-proxy="true"> <aop:include name="userSessionAspect" /> </aop:aspectj-autoproxy>