Skip to content
Snippets Groups Projects
Commit 5aa0968b authored by Daniel Gerhardt's avatar Daniel Gerhardt
Browse files

Remove obsolete CouchDB4j code

parent 245f281f
Branches
1 merge request!68Migration to Ektorp and refactoring of the database layer
Showing
with 2 additions and 259 deletions
......@@ -185,11 +185,6 @@
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>de.thm.couchdb4j</groupId>
<artifactId>couchdb4j</artifactId>
<version>0.8-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.ektorp</groupId>
<artifactId>org.ektorp</artifactId>
......
/*
* This file is part of ARSnova Backend.
* Copyright (C) 2012-2017 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.dao;
import com.fourspaces.couchdb.Database;
import com.fourspaces.couchdb.Document;
import com.fourspaces.couchdb.View;
import com.fourspaces.couchdb.ViewResults;
import de.thm.arsnova.connector.model.Course;
import de.thm.arsnova.entities.*;
import de.thm.arsnova.persistance.ContentRepository;
import de.thm.arsnova.persistance.LogEntryRepository;
import de.thm.arsnova.persistance.MotdRepository;
import de.thm.arsnova.persistance.SessionRepository;
import de.thm.arsnova.services.ISessionService;
import net.sf.json.JSONObject;
import org.checkerframework.checker.nullness.qual.NonNull;
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.context.annotation.Profile;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Database implementation based on CouchDB.
*
* Note to developers:
*
* This class makes use of Spring Framework's caching annotations. When you are about to add new functionality,
* you should also think about the possibility of caching. Ideally, your methods should be dependent on domain
* objects like Session or Content, which can be used as cache keys. Relying on plain String objects as a key, e.g.
* by passing only a Session's keyword, will make your cache annotations less readable. You will also need to think
* about cases where your cache needs to be updated and evicted.
*
* In order to use cached methods from within this object, you have to use the getDatabaseDao() method instead of
* using the "this" pointer. This is because caching is only available if the method is called through a Spring Proxy,
* which is not the case when using "this".
*
* @see <a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html">Spring Framework's Cache Abstraction</a>
* @see <a href="https://github.com/thm-projects/arsnova-backend/wiki/Caching">Caching in ARSnova explained</a>
*/
@Profile("!test")
@Service("databaseDao")
public class CouchDBDao implements IDatabaseDao {
@Autowired
private ISessionService sessionService;
@Autowired
private LogEntryRepository dbLogger;
@Autowired
private SessionRepository sessionRepository;
@Autowired
private MotdRepository motdRepository;
@Autowired
private ContentRepository contentRepository;
private String databaseHost;
private int databasePort;
private String databaseName;
private Database database;
private static final Logger logger = LoggerFactory.getLogger(CouchDBDao.class);
@Value("${couchdb.host}")
public void setDatabaseHost(final String newDatabaseHost) {
databaseHost = newDatabaseHost;
}
@Value("${couchdb.port}")
public void setDatabasePort(final String newDatabasePort) {
databasePort = Integer.parseInt(newDatabasePort);
}
@Value("${couchdb.name}")
public void setDatabaseName(final String newDatabaseName) {
databaseName = newDatabaseName;
}
public void setSessionService(final ISessionService service) {
sessionService = service;
}
/**
* <strike>
* 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
* </strike>
*/
private @NonNull IDatabaseDao getDatabaseDao() {
return this;
}
private Database getDatabase() {
if (database == null) {
try {
final com.fourspaces.couchdb.Session session = new com.fourspaces.couchdb.Session(
databaseHost,
databasePort
);
database = session.getDatabase(databaseName);
} catch (final Exception e) {
logger.error("Cannot connect to CouchDB database '{}' on host '{}' using port {}.",
databaseName, databaseHost, databasePort, e);
}
}
return database;
}
private void deleteDocument(final String documentId) throws IOException {
final Document d = getDatabase().getDocument(documentId);
getDatabase().deleteDocument(d);
}
@SuppressWarnings("unchecked")
@Override
public <T> T getObjectFromId(final String documentId, final Class<T> klass) {
try {
final Document doc = getDatabase().getDocument(documentId);
if (doc == null) {
return null;
}
// TODO: This needs some more error checking...
return (T) JSONObject.toBean(doc.getJSONObject(), klass);
} catch (ClassCastException | IOException | net.sf.json.JSONException e) {
return null;
}
}
private boolean isEmptyResults(final ViewResults results) {
return results == null || results.getResults().isEmpty() || results.getJSONArray("rows").isEmpty();
}
/**
* Adds convenience methods to CouchDB4J's view class.
*/
private static class ExtendedView extends View {
ExtendedView(final String fullname) {
super(fullname);
}
void setCourseIdKeys(final List<Course> courses) {
List<String> courseIds = new ArrayList<>();
for (Course c : courses) {
courseIds.add(c.getId());
}
setKeys(courseIds);
}
void setSessionIdKeys(final List<Session> sessions) {
List<String> sessionIds = new ArrayList<>();
for (Session s : sessions) {
sessionIds.add(s.getId());
}
setKeys(sessionIds);
}
}
}
/*
* This file is part of ARSnova Backend.
* Copyright (C) 2012-2017 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.dao;
/**
* All methods the database must support.
*/
public interface IDatabaseDao {
<T> T getObjectFromId(String documentId, Class<T> klass);
}
/**
* Classes and interfaces for accessing the database
*/
package de.thm.arsnova.dao;
......@@ -17,7 +17,6 @@
*/
package de.thm.arsnova.security;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.entities.Comment;
import de.thm.arsnova.entities.Content;
import de.thm.arsnova.entities.Session;
......@@ -47,9 +46,6 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator {
@Value("${security.admin-accounts}")
private String[] adminAccounts;
@Autowired
private IDatabaseDao dao;
@Autowired
private SessionRepository sessionRepository;
......
......@@ -18,7 +18,6 @@
package de.thm.arsnova.services;
import de.thm.arsnova.ImageUtils;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.entities.Answer;
import de.thm.arsnova.entities.Comment;
import de.thm.arsnova.entities.CommentReadingCount;
......@@ -56,10 +55,6 @@ import java.util.TimerTask;
*/
@Service
public class ContentService implements IContentService, ApplicationEventPublisherAware {
@Autowired
private IDatabaseDao databaseDao;
@Autowired
private IUserService userService;
......@@ -87,10 +82,6 @@ public class ContentService implements IContentService, ApplicationEventPublishe
private HashMap<String, Timer> timerList = new HashMap<>();
public void setDatabaseDao(final IDatabaseDao databaseDao) {
this.databaseDao = databaseDao;
}
@Override
@PreAuthorize("isAuthenticated()")
public List<Content> getSkillQuestions(final String sessionkey) {
......
......@@ -18,7 +18,6 @@
package de.thm.arsnova.services;
import de.thm.arsnova.FeedbackStorage;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.entities.Feedback;
import de.thm.arsnova.entities.Session;
import de.thm.arsnova.entities.User;
......@@ -56,9 +55,6 @@ public class FeedbackService implements IFeedbackService, ApplicationEventPublis
@Value("${feedback.cleanup}")
private int cleanupFeedbackDelay;
@Autowired
private IDatabaseDao databaseDao;
@Autowired
private SessionRepository sessionRepository;
......@@ -66,10 +62,6 @@ public class FeedbackService implements IFeedbackService, ApplicationEventPublis
private ApplicationEventPublisher publisher;
public void setDatabaseDao(final IDatabaseDao newDatabaseDao) {
databaseDao = newDatabaseDao;
}
@PostConstruct
public void init() {
feedbackStorage = new FeedbackStorage();
......
......@@ -18,7 +18,6 @@
package de.thm.arsnova.services;
import com.codahale.metrics.annotation.Gauge;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.entities.DbUser;
import de.thm.arsnova.entities.User;
import de.thm.arsnova.exceptions.BadRequestException;
......@@ -99,9 +98,6 @@ public class UserService implements IUserService {
@Autowired
private UserRepository userRepository;
@Autowired
private IDatabaseDao databaseDao;
@Autowired
private JavaMailSender mailSender;
......
package de.thm.arsnova.config;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.dao.StubDatabaseDao;
import de.thm.arsnova.services.StubUserService;
import de.thm.arsnova.socket.ARSnovaSocket;
......@@ -61,7 +60,7 @@ public class TestAppConfig {
}
@Bean
public IDatabaseDao databaseDao() {
public StubDatabaseDao databaseDao() {
return new StubDatabaseDao();
}
......
......@@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Profile("test")
@Service("databaseDao")
public class StubDatabaseDao implements IDatabaseDao {
public class StubDatabaseDao {
private static Map<String, Session> stubSessions = new ConcurrentHashMap<>();
private static Map<String, Feedback> stubFeedbacks = new ConcurrentHashMap<>();
......@@ -94,10 +94,4 @@ public class StubDatabaseDao implements IDatabaseDao {
contents.add(new Content());
stubQuestions.put("12345678", contents);
}
@Override
public <T> T getObjectFromId(String documentId, Class<T> klass) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -20,13 +20,11 @@ package de.thm.arsnova.services;
import de.thm.arsnova.config.AppConfig;
import de.thm.arsnova.config.TestAppConfig;
import de.thm.arsnova.config.TestSecurityConfig;
import de.thm.arsnova.dao.IDatabaseDao;
import de.thm.arsnova.dao.StubDatabaseDao;
import de.thm.arsnova.entities.Session;
import de.thm.arsnova.exceptions.NotFoundException;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.framework.Advised;
......@@ -41,15 +39,12 @@ import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment