Add event to dispatch the list of available client file

This commit is contained in:
anthonyraymond 2018-01-16 23:28:45 +01:00
parent ec7c608619
commit fff3b96644
7 changed files with 24 additions and 71 deletions

View file

@ -1,13 +1,13 @@
package org.araymond.joal.core; package org.araymond.joal.core;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.araymond.joal.core.bandwith.BandwidthDispatcher; import org.araymond.joal.core.bandwith.BandwidthDispatcher;
import org.araymond.joal.core.bandwith.RandomSpeedProvider; import org.araymond.joal.core.bandwith.RandomSpeedProvider;
import org.araymond.joal.core.client.emulated.BitTorrentClient; import org.araymond.joal.core.client.emulated.BitTorrentClient;
import org.araymond.joal.core.client.emulated.BitTorrentClientProvider; import org.araymond.joal.core.client.emulated.BitTorrentClientProvider;
import org.araymond.joal.core.config.AppConfiguration; import org.araymond.joal.core.config.AppConfiguration;
import org.araymond.joal.core.config.JoalConfigProvider; import org.araymond.joal.core.config.JoalConfigProvider;
import org.araymond.joal.core.events.config.ListOfClientFilesEvent;
import org.araymond.joal.core.events.global.state.GlobalSeedStartedEvent; import org.araymond.joal.core.events.global.state.GlobalSeedStartedEvent;
import org.araymond.joal.core.events.global.state.GlobalSeedStoppedEvent; import org.araymond.joal.core.events.global.state.GlobalSeedStoppedEvent;
import org.araymond.joal.core.events.speed.SeedingSpeedsHasChangedEvent; import org.araymond.joal.core.events.speed.SeedingSpeedsHasChangedEvent;
@ -22,6 +22,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
/** /**
* Created by raymo on 27/01/2017. * Created by raymo on 27/01/2017.
@ -55,14 +56,15 @@ public class SeedManager {
this.joalFoldersPath = new JoalFoldersPath(Paths.get(joalConfFolder)); this.joalFoldersPath = new JoalFoldersPath(Paths.get(joalConfFolder));
this.torrentFileProvider = new TorrentFileProvider(joalFoldersPath); this.torrentFileProvider = new TorrentFileProvider(joalFoldersPath);
this.configProvider = new JoalConfigProvider(mapper, joalFoldersPath, publisher); this.configProvider = new JoalConfigProvider(mapper, joalFoldersPath, publisher);
this.bitTorrentClientProvider = new BitTorrentClientProvider(configProvider, mapper, joalFoldersPath, publisher); this.bitTorrentClientProvider = new BitTorrentClientProvider(configProvider, mapper, joalFoldersPath);
this.publisher = publisher; this.publisher = publisher;
this.connectionHandler = new ConnectionHandler(); this.connectionHandler = new ConnectionHandler();
} }
public void startSeeding() throws IOException { public void startSeeding() throws IOException {
this.configProvider.init(); this.configProvider.init();
this.bitTorrentClientProvider.init(); final List<String> clientFiles = this.bitTorrentClientProvider.listClientFiles();
this.publisher.publishEvent(new ListOfClientFilesEvent(clientFiles));
this.bitTorrentClientProvider.generateNewClient(); this.bitTorrentClientProvider.generateNewClient();
final BitTorrentClient bitTorrentClient = bitTorrentClientProvider.get(); final BitTorrentClient bitTorrentClient = bitTorrentClientProvider.get();

View file

@ -3,10 +3,8 @@ package org.araymond.joal.core.client.emulated;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.araymond.joal.core.SeedManager; import org.araymond.joal.core.SeedManager;
import org.araymond.joal.core.config.JoalConfigProvider; import org.araymond.joal.core.config.JoalConfigProvider;
import org.araymond.joal.core.events.old.config.ClientFilesDiscoveredEvent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher;
import javax.inject.Provider; import javax.inject.Provider;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -27,21 +25,18 @@ public class BitTorrentClientProvider implements Provider<BitTorrentClient> {
private final JoalConfigProvider configProvider; private final JoalConfigProvider configProvider;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
private final Path clientsFolderPath; private final Path clientsFolderPath;
private final ApplicationEventPublisher publisher;
public BitTorrentClientProvider(final JoalConfigProvider configProvider, final ObjectMapper objectMapper, final SeedManager.JoalFoldersPath joalFoldersPath, final ApplicationEventPublisher publisher) { public BitTorrentClientProvider(final JoalConfigProvider configProvider, final ObjectMapper objectMapper, final SeedManager.JoalFoldersPath joalFoldersPath) {
this.configProvider = configProvider; this.configProvider = configProvider;
this.objectMapper = objectMapper; this.objectMapper = objectMapper;
this.clientsFolderPath = joalFoldersPath.getClientsFilesPath(); this.clientsFolderPath = joalFoldersPath.getClientsFilesPath();
this.publisher = publisher;
} }
public void init() { public List<String> listClientFiles() {
try (Stream<Path> paths = Files.walk(this.clientsFolderPath)) { try (Stream<Path> paths = Files.walk(this.clientsFolderPath)) {
final List<String> clients = paths.filter(p -> p.toString().endsWith(".client")) return paths.filter(p -> p.toString().endsWith(".client"))
.map(p -> p.getFileName().toString()) .map(p -> p.getFileName().toString())
.collect(Collectors.toList()); .collect(Collectors.toList());
publisher.publishEvent(new ClientFilesDiscoveredEvent(clients));
} catch (final IOException e) { } catch (final IOException e) {
throw new IllegalStateException("Failed to walk through .clients files", e); throw new IllegalStateException("Failed to walk through .clients files", e);
} }

View file

@ -1,16 +1,13 @@
package org.araymond.joal.core.events.old.config; package org.araymond.joal.core.events.config;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import java.util.List; import java.util.List;
/** public class ListOfClientFilesEvent {
* Created by raymo on 08/07/2017.
*/
public class ClientFilesDiscoveredEvent {
private final List<String> clients; private final List<String> clients;
public ClientFilesDiscoveredEvent(final List<String> clients) { public ListOfClientFilesEvent(final List<String> clients) {
Preconditions.checkNotNull(clients, "Clients list must not be null"); Preconditions.checkNotNull(clients, "Clients list must not be null");
this.clients = clients; this.clients = clients;
} }
@ -18,6 +15,4 @@ public class ClientFilesDiscoveredEvent {
public List<String> getClients() { public List<String> getClients() {
return clients; return clients;
} }
} }

View file

@ -1,6 +1,6 @@
package org.araymond.joal.web.messages.outgoing.impl.config; package org.araymond.joal.web.messages.outgoing.impl.config;
import org.araymond.joal.core.events.old.config.ClientFilesDiscoveredEvent; import org.araymond.joal.core.events.config.ListOfClientFilesEvent;
import org.araymond.joal.web.messages.outgoing.MessagePayload; import org.araymond.joal.web.messages.outgoing.MessagePayload;
import java.util.List; import java.util.List;
@ -12,7 +12,7 @@ public class ClientFilesDiscoveredPayload implements MessagePayload {
private final List<String> clients; private final List<String> clients;
public ClientFilesDiscoveredPayload(final ClientFilesDiscoveredEvent event) { public ClientFilesDiscoveredPayload(final ListOfClientFilesEvent event) {
this.clients = event.getClients(); this.clients = event.getClients();
} }

View file

@ -1,6 +1,6 @@
package org.araymond.joal.web.services.corelistener; package org.araymond.joal.web.services.corelistener;
import org.araymond.joal.core.events.old.config.ClientFilesDiscoveredEvent; import org.araymond.joal.core.events.config.ListOfClientFilesEvent;
import org.araymond.joal.core.events.old.config.ConfigHasBeenLoadedEvent; import org.araymond.joal.core.events.old.config.ConfigHasBeenLoadedEvent;
import org.araymond.joal.core.events.old.config.ConfigHasChangedEvent; import org.araymond.joal.core.events.old.config.ConfigHasChangedEvent;
import org.araymond.joal.web.annotations.ConditionalOnWebUi; import org.araymond.joal.web.annotations.ConditionalOnWebUi;
@ -48,8 +48,8 @@ public class WebConfigEventListener extends WebEventListener {
@Order(Ordered.LOWEST_PRECEDENCE) @Order(Ordered.LOWEST_PRECEDENCE)
@EventListener @EventListener
void handleClientFilesDiscovered(final ClientFilesDiscoveredEvent event) { void handleClientFilesDiscovered(final ListOfClientFilesEvent event) {
logger.debug("Send ClientFilesDiscoveredEvent to clients."); logger.debug("Send ListOfClientFilesEvent to clients.");
this.messagingTemplate.convertAndSend("/config", new ClientFilesDiscoveredPayload(event)); this.messagingTemplate.convertAndSend("/config", new ClientFilesDiscoveredPayload(event));
} }

View file

@ -4,14 +4,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.araymond.joal.core.SeedManager; import org.araymond.joal.core.SeedManager;
import org.araymond.joal.core.config.JoalConfigProvider; import org.araymond.joal.core.config.JoalConfigProvider;
import org.araymond.joal.core.config.JoalConfigProviderTest; import org.araymond.joal.core.config.JoalConfigProviderTest;
import org.araymond.joal.core.events.old.config.ClientFilesDiscoveredEvent;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.context.ApplicationEventPublisher;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
@ -26,14 +24,14 @@ public class BitTorrentClientProviderTest {
private static BitTorrentClientProvider createProvider() { private static BitTorrentClientProvider createProvider() {
final JoalConfigProvider configProvider = Mockito.mock(JoalConfigProvider.class); final JoalConfigProvider configProvider = Mockito.mock(JoalConfigProvider.class);
Mockito.when(configProvider.get()).thenReturn(JoalConfigProviderTest.defaultConfig); Mockito.when(configProvider.get()).thenReturn(JoalConfigProviderTest.defaultConfig);
return new BitTorrentClientProvider(configProvider, new ObjectMapper(), joalFoldersPath, Mockito.mock(ApplicationEventPublisher.class)); return new BitTorrentClientProvider(configProvider, new ObjectMapper(), joalFoldersPath);
} }
@Test @Test
public void shouldFailIfClientFileDoesNotExists() { public void shouldFailIfClientFileDoesNotExists() {
final JoalConfigProvider configProvider = Mockito.mock(JoalConfigProvider.class); final JoalConfigProvider configProvider = Mockito.mock(JoalConfigProvider.class);
Mockito.when(configProvider.get()).thenReturn(JoalConfigProviderTest.defaultConfig); Mockito.when(configProvider.get()).thenReturn(JoalConfigProviderTest.defaultConfig);
final BitTorrentClientProvider provider = new BitTorrentClientProvider(configProvider, new ObjectMapper(), new SeedManager.JoalFoldersPath(Paths.get("nop")), Mockito.mock(ApplicationEventPublisher.class)); final BitTorrentClientProvider provider = new BitTorrentClientProvider(configProvider, new ObjectMapper(), new SeedManager.JoalFoldersPath(Paths.get("nop")));
assertThatThrownBy(provider::generateNewClient) assertThatThrownBy(provider::generateNewClient)
.isInstanceOf(FileNotFoundException.class) .isInstanceOf(FileNotFoundException.class)
@ -70,18 +68,12 @@ public class BitTorrentClientProviderTest {
} }
@Test @Test
public void shouldPublishClientFilesDiscoveredOnInit() { public void shouldistClientFiles() {
final ApplicationEventPublisher publisher = Mockito.mock(ApplicationEventPublisher.class); final BitTorrentClientProvider provider = new BitTorrentClientProvider(Mockito.mock(JoalConfigProvider.class), new ObjectMapper(), joalFoldersPath);
final BitTorrentClientProvider provider = new BitTorrentClientProvider(Mockito.mock(JoalConfigProvider.class), new ObjectMapper(), joalFoldersPath, publisher);
provider.init(); final List<String> clientFiles = provider.listClientFiles();
assertThat(clientFiles).hasSize(1);
final ArgumentCaptor<ClientFilesDiscoveredEvent> captor = ArgumentCaptor.forClass(ClientFilesDiscoveredEvent.class); assertThat(clientFiles.get(0)).isEqualTo("azureus-5.7.5.0.client");
Mockito.verify(publisher, Mockito.times(1)).publishEvent(captor.capture());
final ClientFilesDiscoveredEvent event = captor.getValue();
assertThat(event.getClients()).hasSize(1);
assertThat(event.getClients().get(0)).isEqualTo("azureus-5.7.5.0.client");
} }

View file

@ -1,31 +0,0 @@
package org.araymond.joal.core.events.old.config;
import com.google.common.collect.Lists;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Created by raymo on 09/07/2017.
*/
public class ClientFilesDiscoveredEventTest {
@Test
public void shouldNotBuildWithoutClientList() {
assertThatThrownBy(() -> new ClientFilesDiscoveredEvent(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("Clients list must not be null");
}
@Test
public void shouldBuild() {
final List<String> clients = Lists.newArrayList("az.client", "ut.client");
final ClientFilesDiscoveredEvent event = new ClientFilesDiscoveredEvent(clients);
assertThat(event.getClients()).isEqualTo(clients);
}
}