mirror of
https://github.com/anthonyraymond/joal.git
synced 2024-09-20 15:26:25 +08:00
Add event to dispatch the list of available client file
This commit is contained in:
parent
ec7c608619
commit
fff3b96644
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in a new issue