Commit 1239bc4e authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

initial version of refactored repositories

parent a52bf60c
......@@ -5,7 +5,6 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.ClassPath;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.telephoners.krakyournet.ctf.auth.UserAuthenticator;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.commands.PurgeDatabaseCommand;
import com.telephoners.krakyournet.ctf.commands.RegisterTasksCommand;
......@@ -14,12 +13,9 @@ import com.telephoners.krakyournet.ctf.core.ApplicationConfiguration;
import com.telephoners.krakyournet.ctf.logging.LoggingFilter;
import com.telephoners.krakyournet.ctf.modules.ApplicationModule;
import com.telephoners.krakyournet.ctf.repositories.SofaRepository;
import com.telephoners.krakyournet.ctf.repositories.UsersRepository;
import io.dropwizard.Application;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.auth.AuthDynamicFeature;
import io.dropwizard.auth.AuthValueFactoryProvider;
import io.dropwizard.auth.basic.BasicCredentialAuthFilter;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
......@@ -51,16 +47,16 @@ public class CTFApplication extends Application<ApplicationConfiguration>
JerseyEnvironment jersey = environment.jersey();
final ClassPath classPath = ClassPath.from(this.getClass().getClassLoader());
ImmutableSet<ClassPath.ClassInfo> resourceClasses = classPath.getTopLevelClasses("com.telephoners.krakyournet.ctf.resources");
resourceClasses.stream()
.forEach(classInfo -> jersey.register(injector.getInstance(classInfo.load())));
// resourceClasses.stream()
// .forEach(classInfo -> jersey.register(injector.getInstance(classInfo.load())));
}
private void registerAuthFeatures(Environment environment)
{
environment.jersey().register(new AuthDynamicFeature(
new BasicCredentialAuthFilter.Builder<User>()
.setAuthenticator(injector.getInstance(UserAuthenticator.class))
.buildAuthFilter()));
// environment.jersey().register(new AuthDynamicFeature(
// new BasicCredentialAuthFilter.Builder<User>()
// .setAuthenticator(injector.getInstance(UserAuthenticator.class))
// .buildAuthFilter()));
environment.jersey().register(RolesAllowedDynamicFeature.class);
environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class));
}
......@@ -95,8 +91,8 @@ public class CTFApplication extends Application<ApplicationConfiguration>
private void registerAdmins(ApplicationConfiguration applicationConfiguration)
{
UsersRepository usersRepository = injector.getInstance(UsersRepository.class);
applicationConfiguration.getAdmins().forEach(usersRepository::add);
// UsersRepository usersRepository = injector.getInstance(UsersRepository.class);
// applicationConfiguration.getAdmins().forEach(usersRepository::add);
}
private Injector createInjector(ApplicationConfiguration applicationConfiguration)
......
package com.telephoners.krakyournet.ctf.beans;
import com.telephoners.krakyournet.ctf.beans.tasks.Task;
import org.ektorp.support.CouchDbDocument;
import org.joda.time.Instant;
import static com.google.common.base.Preconditions.checkNotNull;
public class Solution
public class Solution extends CouchDbDocument
{
private Task task;
private Team team;
......
......@@ -2,10 +2,12 @@ package com.telephoners.krakyournet.ctf.beans;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.ektorp.support.CouchDbDocument;
import java.util.List;
public class Team {
public class Team extends CouchDbDocument
{
private String name;
private String description;
......
......@@ -4,13 +4,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.helpers.PublicProperty;
import org.ektorp.support.CouchDbDocument;
import javax.ws.rs.core.Response;
import java.net.URISyntaxException;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
public abstract class Task
public abstract class Task extends CouchDbDocument
{
@PublicProperty
private String name;
......
......@@ -30,7 +30,7 @@ public class RegisterTasksCommand extends ConfiguredCommand<ApplicationConfigura
List<TextTask> cryptoTasks = applicationConfiguration.getTextTasks();
List<WebTask> webTasks = applicationConfiguration.getWebTasks();
tasksRepository.clean();
// tasksRepository.clean();
cryptoTasks.forEach(tasksRepository::add);
webTasks.forEach(tasksRepository::add);
......
......@@ -25,7 +25,7 @@ public class RegisterTeamsCommand extends ConfiguredCommand<ApplicationConfigura
TeamsRepository teamsRepository = injector.getInstance(TeamsRepository.class);
UsersRepository usersRepository = injector.getInstance(UsersRepository.class);
teamsRepository.clean();
// teamsRepository.clean();
applicationConfiguration.getTeams().forEach(team -> {
team.getMembers().stream().forEach(usersRepository::add);
teamsRepository.add(team);
......
......@@ -2,17 +2,20 @@ package com.telephoners.krakyournet.ctf.modules;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.name.Named;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.core.ApplicationConfiguration;
import com.telephoners.krakyournet.ctf.repositories.Repository;
import org.ektorp.CouchDbConnector;
import org.ektorp.CouchDbInstance;
import org.ektorp.http.HttpClient;
import org.ektorp.http.StdHttpClient;
import org.ektorp.impl.StdCouchDbConnector;
import org.ektorp.impl.StdCouchDbInstance;
import org.ektorp.support.CouchDbDocument;
import java.net.MalformedURLException;
//tdo: split modules
public class ApplicationModule extends AbstractModule
{
private final ApplicationConfiguration applicationConfiguration;
......@@ -28,9 +31,15 @@ public class ApplicationModule extends AbstractModule
bind(ApplicationConfiguration.class).toInstance(applicationConfiguration);
}
@Provides
public Repository provideUserRepository(final CouchDbConnector connector)
{
return createRepository(User.class, connector);
}
@Provides
//todo: hide behind interface
public CouchDbConnector provideDatastore(@Named("database.instance") CouchDbInstance databaseInstance)
public CouchDbConnector provideDatastore(/*@Named("database.instance") */CouchDbInstance databaseInstance)
{
databaseInstance.deleteDatabase("database"); //todo: temp
final StdCouchDbConnector database = new StdCouchDbConnector("database", databaseInstance); //todo: to configuration
......@@ -40,14 +49,14 @@ public class ApplicationModule extends AbstractModule
}
@Provides
@Named("database.instance")
public CouchDbInstance provideDatabaseInstance(@Named("database.http.client") final HttpClient httpClient)
// @Named("database.instance")
public CouchDbInstance provideDatabaseInstance(/*@Named("database.http.client") */final HttpClient httpClient)
{
return new StdCouchDbInstance(httpClient);
}
@Provides
@Named("database.http.client")
// @Named("database.http.client")
public HttpClient provideDatabaseHttpClient() throws MalformedURLException
{
return new StdHttpClient.Builder()
......@@ -57,4 +66,8 @@ public class ApplicationModule extends AbstractModule
.build();
}
private Repository createRepository(final Class<? extends CouchDbDocument> clazz, final CouchDbConnector connector)
{
return new Repository<>(clazz, connector);
}
}
package com.telephoners.krakyournet.ctf.repositories;
import javax.inject.Inject;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.ektorp.CouchDbConnector;
import org.ektorp.support.CouchDbDocument;
import org.ektorp.support.CouchDbRepositorySupport;
public abstract class Repository<T>
public class Repository<T extends CouchDbDocument> extends CouchDbRepositorySupport<T>
{
@Inject
public Repository()
public Repository(final Class<T> type, final CouchDbConnector connector)
{
}
public void add(T item)
{
// datastore.save(item);
}
public List<T> getAll()
{
return null;
// return datastore.createQuery(getRepositoryType()).asList();
}
public void clean()
{
// datastore.getCollection(getRepositoryType()).drop();
}
Class getRepositoryType()
{
try {
return Class.forName((((ParameterizedType) this.getClass().getGenericSuperclass())
.getActualTypeArguments()[0]).getTypeName());
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Class not found");
}
super(type, connector);
}
}
......@@ -3,27 +3,23 @@ package com.telephoners.krakyournet.ctf.repositories;
import com.telephoners.krakyournet.ctf.beans.Flag;
import com.telephoners.krakyournet.ctf.beans.Solution;
import com.telephoners.krakyournet.ctf.beans.Team;
import com.telephoners.krakyournet.ctf.beans.tasks.Task;
import com.telephoners.krakyournet.ctf.exceptions.SolutionAlreadySubmittedException;
import org.ektorp.CouchDbConnector;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Singleton
public class SolutionsRepository extends Repository<Solution>
{
private final TasksRepository tasksRepository;
@Inject
public SolutionsRepository(TasksRepository tasksRepository)
public SolutionsRepository(Class<Solution> type, CouchDbConnector connector)
{
this.tasksRepository = tasksRepository;
super(type, connector);
}
public Map<Integer, List<Flag>> getTeamSolutions(Team team)
{
return null;
......@@ -65,13 +61,14 @@ public class SolutionsRepository extends Repository<Solution>
public List<Integer> getCompletedTasks(Team team)
{
Map<Integer, List<Flag>> teamSolutions = getTeamSolutions(team);
return tasksRepository.getAll().stream()
.filter(task -> {
List<Flag> teamTaskSolutions = teamSolutions.get(task.getLevel());
return teamTaskSolutions != null && teamTaskSolutions.size() == task.getFlags().size();
})
.map(Task::getLevel)
.collect(Collectors.toList());
return null;
// return tasksRepository.getAll().stream()
// .filter(task -> {
// List<Flag> teamTaskSolutions = teamSolutions.get(task.getLevel());
// return teamTaskSolutions != null && teamTaskSolutions.size() == task.getFlags().size();
// })
// .map(Task::getLevel)
// .collect(Collectors.toList());
}
public void submitSolution(Solution solution)
......
......@@ -2,16 +2,13 @@ package com.telephoners.krakyournet.ctf.repositories;
import com.sun.tools.javac.util.List;
import com.telephoners.krakyournet.ctf.beans.tasks.Task;
import org.ektorp.CouchDbConnector;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class TasksRepository extends Repository<Task>
{
@Inject
public TasksRepository()
public TasksRepository(Class<Task> type, CouchDbConnector connector)
{
super(type, connector);
}
public Task getByLevel(int level)
......
......@@ -2,19 +2,15 @@ package com.telephoners.krakyournet.ctf.repositories;
import com.telephoners.krakyournet.ctf.beans.Team;
import com.telephoners.krakyournet.ctf.beans.User;
import org.ektorp.CouchDbConnector;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class TeamsRepository extends Repository<Team>
{
private final UsersRepository usersRepository;
@Inject
public TeamsRepository(UsersRepository usersRepository)
public TeamsRepository(Class<Team> type, CouchDbConnector connector)
{
this.usersRepository = usersRepository;
super(type, connector);
}
public Team getTeamByUser(User user)
......@@ -29,6 +25,7 @@ public class TeamsRepository extends Repository<Team>
public Team getTeamByUserName(String username)
{
return getTeamByUser(usersRepository.getUserByName(username));
return null;
// return getTeamByUser(usersRepository.getUserByName(username));
}
}
package com.telephoners.krakyournet.ctf.repositories;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.providers.MessageDigestProvider;
import io.dropwizard.auth.basic.BasicCredentials;
import org.ektorp.CouchDbConnector;
@Singleton
public class UsersRepository extends Repository<User>
{
private final MessageDigestProvider messageDigestProvider;
@Inject
public UsersRepository(MessageDigestProvider messageDigestProvider)
public UsersRepository(Class<User> type, CouchDbConnector connector)
{
this.messageDigestProvider = messageDigestProvider;
super(type, connector);
}
public User getUserByName(String username)
......
Markdown is supported
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