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