Skip to content

Commit 70b510f

Browse files
authored
[PR] Merge pull request #78 from CSC207-2022F-UofT/patch-mirror
[U] Apply selected mirror to LocalDatabaseFetcher and Downloader
2 parents d240c87 + 5602ccb commit 70b510f

File tree

19 files changed

+193
-45
lines changed

19 files changed

+193
-45
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,4 @@ build
3131
data
3232
.mcpm
3333
*.pyc
34-
3534
plugins

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ checkstyle {
4343
maxWarnings = 5
4444
}
4545

46+
task checkStyle(type: GradleBuild) {
47+
tasks = ['checkStyleMain', 'checkStyleTest']
48+
}
49+
4650

4751
dependencies {
4852
// The Spigot API with no shadowing. Requires the OSS repo.

src/main/java/org/hydev/mcpm/client/arguments/ArgsParser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public ArgsParser(List<CommandParser> allParsers, Consumer<String> log) {
4949

5050
// Create help string and help command
5151
help = "mcpm: Minecraft Plugin Package Manager\n" + String.join("", allParsers.stream()
52+
.filter(it -> !it.description().isBlank())
5253
.map(it -> String.format("&f/mcpm %s &6- %s&r\n", it.name(), it.description())).toList()) +
5354
"To view the help message of a command, use /mcpm <command> -h";
5455
var helpSub = parsers.addParser("help", false);

src/main/java/org/hydev/mcpm/client/arguments/CommandsFactory.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.hydev.mcpm.client.updater.UpdateInteractor;
2222
import org.hydev.mcpm.utils.ColorLogger;
2323

24-
import java.net.URI;
2524
import java.util.List;
2625
import java.util.function.Consumer;
2726
import java.util.stream.Stream;
@@ -42,33 +41,35 @@ private CommandsFactory() { }
4241
* @return Returns a list of argument parsers that work in any environment (Server & CLI).
4342
*/
4443
public static List<CommandParser> baseParsers(boolean isMinecraft) {
45-
var host = URI.create("https://mcpm.hydev.org");
46-
var fetcher = new LocalDatabaseFetcher(host);
44+
var mirror = new MirrorSelector();
45+
var fetcher = new LocalDatabaseFetcher(mirror.selectedMirrorSupplier());
4746
var tracker = new LocalPluginTracker();
4847
var jarFinder = new LocalJarFinder();
4948

5049
var loader = isMinecraft ? new PluginLoader(jarFinder) : null;
5150
var listener = new ProgressBarFetcherListener();
5251
var searcher = new SearchInteractor(fetcher, listener);
5352
var installer = new InstallInteractor(
54-
new SpigotPluginDownloader(new Downloader(), host.toString()),
53+
new SpigotPluginDownloader(new Downloader(), mirror.selectedMirrorSupplier()),
5554
new DatabaseManager(tracker, searcher),
5655
loader
5756
);
5857
var matcher = new MatchPluginsInteractor(fetcher, listener);
5958
var updateChecker = new CheckForUpdatesInteractor(matcher);
6059
var updater = new UpdateInteractor(updateChecker, installer, tracker);
6160

61+
// Controllers
6262
var exportPluginsController = new ExportPluginsController(new ExportInteractor(tracker));
6363
var listController = new ListController(new ListAllInteractor(tracker));
6464
var searchController = new SearchPackagesController(searcher);
65-
var mirrorController = new MirrorController(new MirrorSelector());
65+
var mirrorController = new MirrorController(mirror);
6666
var infoController = new InfoController(tracker);
6767

6868
var databaseManager = new DatabaseManager(tracker, searcher);
6969
var installController = new InstallController(installer);
7070
var uninstallController = new UninstallController(new Uninstaller(tracker, loader, jarFinder));
7171
var updateController = new UpdateController(updater);
72+
var refreshController = new RefreshController(fetcher, listener, mirror);
7273

7374
/*
7475
* Add general parsers to this list!
@@ -82,6 +83,7 @@ public static List<CommandParser> baseParsers(boolean isMinecraft) {
8283
new MirrorParser(mirrorController),
8384
new InfoParser(infoController),
8485
new InstallParser(installController),
86+
new RefreshParser(refreshController),
8587
new UninstallParser(uninstallController),
8688
new UpdateParser(updateController)
8789
);

src/main/java/org/hydev/mcpm/client/arguments/parsers/CommandParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public interface CommandParser extends CommandHandler {
1414
String name();
1515

1616
/**
17-
* Description of the command
17+
* Description of the command. If the description is empty, it will not show up in the help menu.
1818
*
1919
* @return Description
2020
*/

src/main/java/org/hydev/mcpm/client/arguments/parsers/MirrorParser.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ public String description()
3131
@Override
3232
public void run(Namespace details, Consumer<String> log)
3333
{
34-
switch (details.getString("op"))
34+
var op = details.getString("op");
35+
switch (op)
3536
{
3637
case "ping" -> controller.ping(details.getBoolean("refresh"), log);
3738
case "select" -> controller.select(details.getString("host"), log);
38-
default -> throw new RuntimeException();
39+
default -> throw new UnsupportedOperationException("Unknown operation: " + op);
3940
}
4041
}
4142

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.hydev.mcpm.client.arguments.parsers;
2+
3+
import net.sourceforge.argparse4j.inf.Namespace;
4+
import net.sourceforge.argparse4j.inf.Subparser;
5+
import org.hydev.mcpm.client.commands.entries.RefreshController;
6+
7+
import java.io.IOException;
8+
import java.util.function.Consumer;
9+
10+
/**
11+
* Refresh the database cache and mirror list
12+
*
13+
* @author Azalea (https://github.com/hykilpikonna)
14+
* @since 2022-11-24
15+
*/
16+
public record RefreshParser(RefreshController controller) implements CommandParser
17+
{
18+
@Override
19+
public String name()
20+
{
21+
return "refresh";
22+
}
23+
24+
@Override
25+
public String description()
26+
{
27+
return "Refresh cached plugin database";
28+
}
29+
30+
@Override
31+
public void configure(Subparser parser)
32+
{
33+
34+
}
35+
36+
@Override
37+
public void run(Namespace details, Consumer<String> log)
38+
{
39+
try
40+
{
41+
controller.refresh();
42+
log.accept("&aDatabase refreshed successfully!");
43+
}
44+
catch (IOException e)
45+
{
46+
log.accept("&cDatabase refresh failed: " + e.getMessage());
47+
}
48+
}
49+
}

src/main/java/org/hydev/mcpm/client/commands/entries/MirrorController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ public void ping(boolean refresh, Consumer<String> log)
5959
List.of((selected.host().equals(it.k().host()) ? "&6> " : "&f ") + it.k().host(),
6060
formatPing(it.v()), formatSpeed(it.k().speed()))).toList(),
6161
List.of(":Host", "Delay:", "Speed:")));
62+
63+
// User feedback
64+
log.accept("You can use /mcpm mirror select <host> to select a mirror.");
6265
}
6366
catch (IOException e)
6467
{
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.hydev.mcpm.client.commands.entries;
2+
3+
import org.hydev.mcpm.client.database.fetcher.DatabaseFetcher;
4+
import org.hydev.mcpm.client.database.fetcher.DatabaseFetcherListener;
5+
import org.hydev.mcpm.client.database.mirrors.MirrorSelectBoundary;
6+
7+
import java.io.IOException;
8+
9+
/**
10+
* Controller for the refresh command
11+
*
12+
* @author Azalea (https://github.com/hykilpikonna)
13+
* @since 2022-11-24
14+
*/
15+
public record RefreshController(
16+
DatabaseFetcher fetcher,
17+
DatabaseFetcherListener listener,
18+
MirrorSelectBoundary mirror
19+
)
20+
{
21+
/**
22+
* Refresh the database cache and mirror list
23+
*/
24+
public void refresh() throws IOException
25+
{
26+
// Refresh local database
27+
if (fetcher.fetchDatabase(false, listener) == null)
28+
{
29+
throw new IOException("Database fetching failed");
30+
}
31+
32+
// Refresh mirror list
33+
mirror.updateMirrors();
34+
}
35+
}

src/main/java/org/hydev/mcpm/client/database/fetcher/LocalDatabaseFetcher.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
import java.nio.file.Files;
1919
import java.nio.file.Path;
2020
import java.nio.file.Paths;
21+
import java.security.NoSuchAlgorithmException;
22+
import java.util.function.Supplier;
2123

2224
import static org.hydev.mcpm.Constants.JACKSON;
25+
import static org.hydev.mcpm.utils.GeneralUtils.concatUri;
2326

2427
/**
2528
* A database fetcher that has a local persistent cache along and a network fallback.
2629
*/
2730
public class LocalDatabaseFetcher implements DatabaseFetcher {
28-
private final URI host;
31+
private final Supplier<URI> host;
2932
private final Path cacheDirectory;
3033

3134
private Database localDatabase;
@@ -45,7 +48,7 @@ public class LocalDatabaseFetcher implements DatabaseFetcher {
4548
* @param host The host URL MCPM server mirror that will be used to request database files.
4649
* Example: "http://mcpm.hydev.com"
4750
*/
48-
public LocalDatabaseFetcher(URI host) {
51+
public LocalDatabaseFetcher(Supplier<URI> host) {
4952
this(host, Path.of(".mcpm/"));
5053
}
5154

@@ -56,15 +59,15 @@ public LocalDatabaseFetcher(URI host) {
5659
* Example: "http://mcpm.hydev.com"
5760
* @param cacheDirectory The directory that the cached database and hash file will be stored (as child files).
5861
*/
59-
public LocalDatabaseFetcher(URI host, Path cacheDirectory) {
62+
public LocalDatabaseFetcher(Supplier<URI> host, Path cacheDirectory) {
6063
this.host = host;
6164
this.cacheDirectory = cacheDirectory;
6265
}
6366

6467
private ClassicHttpRequest requestTo(String path) {
65-
var request = new HttpGet(URI.create(host.toString() + "/" + path));
68+
var request = new HttpGet(concatUri(host.get(), path));
6669

67-
request.addHeader("Host", host.getHost());
70+
request.addHeader("Host", host.get().getHost());
6871
request.addHeader("User-Agent", USER_AGENT);
6972
request.addHeader("Accepts", "application/json");
7073

0 commit comments

Comments
 (0)