Skip to content

Commit be94bf3

Browse files
authored
Merge branch 'main' into patch-mirror
2 parents d554091 + d240c87 commit be94bf3

File tree

12 files changed

+337
-32
lines changed

12 files changed

+337
-32
lines changed

src/main/java/org/hydev/mcpm/client/Downloader.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import org.hydev.mcpm.client.interaction.ProgressBarTheme;
88
import org.hydev.mcpm.client.interaction.ProgressRow;
99

10+
import java.io.ByteArrayOutputStream;
11+
import java.io.File;
12+
import java.io.IOException;
1013
import java.io.*;
1114
import java.net.HttpURLConnection;
1215
import java.net.URL;
1316
import java.nio.file.Files;
14-
import java.util.ArrayList;
1517
import java.util.HashMap;
1618
import java.util.Map;
1719
import java.util.concurrent.ExecutorService;
@@ -140,16 +142,27 @@ public Downloader threads(int threads)
140142
*
141143
* @param args Not used
142144
*/
143-
public static void main(String[] args)
145+
public static void main(String[] args) throws IOException
144146
{
145-
String link = "https://mcpm.hydev.org/db";
146-
File out = new File("./build/db.json");
147-
String link1 = "https://mcpm.hydev.org/db.zst";
148-
File out1 = new File("./build/db.zst");
149-
Downloader downloader = new Downloader().showProgress(true).threads(2);
147+
// Remember to chang link to test
148+
String link = "https://sd.blackball.lv/library/Introduction_to_Algorithms_Third_Edition_(2009).pdf";
149+
File out = new File("./Introduction_to_Algorithms_Third_Edition.pdf");
150+
String link1 = "https://www.iusb.edu/students/academic-success-programs/academic-centers-for-excellence/docs/Basic%20Math%20Review%20Card.pdf";
151+
File out1 = new File("./Math.pdf");
152+
String link2 = "https://ouopentextbooks.org/mathematics/files/2015/07/1503.pdf";
153+
File out2 = new File("./1503");
154+
String link3 = "https://faculty.math.illinois.edu/~aydin/math220/lecturenotes/m220_Sec1_4.pdf";
155+
File out3 = new File("./m220_Sec1_4");
156+
String link4 = "https://ocw.mit.edu/ans7870/9/9.00SC/MIT9_00SCF11_text.pdf";
157+
File out4 = new File("./MIT9_00SCF11_text");
158+
159+
final var downloader = new Downloader();
150160
Map<String, File> urls = new HashMap<>();
151161
urls.put(link, out);
152162
urls.put(link1, out1);
163+
urls.put(link2, out2);
164+
urls.put(link3, out3);
165+
urls.put(link4, out4);
153166
downloader.downloadFiles(urls);
154167
out.delete();
155168
out1.delete();

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import org.hydev.mcpm.client.database.fetcher.ProgressBarFetcherListener;
1414
import org.hydev.mcpm.client.database.mirrors.MirrorSelector;
1515
import org.hydev.mcpm.client.database.searchusecase.SearchInteractor;
16+
import org.hydev.mcpm.client.injector.LocalJarFinder;
1617
import org.hydev.mcpm.client.injector.PluginLoader;
1718
import org.hydev.mcpm.client.installer.InstallInteractor;
1819
import org.hydev.mcpm.client.installer.SpigotPluginDownloader;
20+
import org.hydev.mcpm.client.uninstall.Uninstaller;
1921
import org.hydev.mcpm.client.updater.UpdateInteractor;
2022
import org.hydev.mcpm.utils.ColorLogger;
2123

@@ -42,7 +44,9 @@ public static List<CommandParser> baseParsers(boolean isMinecraft) {
4244
var mirror = new MirrorSelector();
4345
var fetcher = new LocalDatabaseFetcher(mirror.selectedMirrorSupplier());
4446
var tracker = new LocalPluginTracker();
45-
var loader = isMinecraft ? new PluginLoader() : null;
47+
var jarFinder = new LocalJarFinder();
48+
49+
var loader = isMinecraft ? new PluginLoader(jarFinder) : null;
4650
var listener = new ProgressBarFetcherListener();
4751
var searcher = new SearchInteractor(fetcher, listener);
4852
var installer = new InstallInteractor(
@@ -60,7 +64,10 @@ public static List<CommandParser> baseParsers(boolean isMinecraft) {
6064
var searchController = new SearchPackagesController(searcher);
6165
var mirrorController = new MirrorController(mirror);
6266
var infoController = new InfoController(tracker);
67+
68+
var databaseManager = new DatabaseManager(tracker, searcher);
6369
var installController = new InstallController(installer);
70+
var uninstallController = new UninstallController(new Uninstaller(tracker, loader, jarFinder));
6471
var updateController = new UpdateController(updater);
6572
var refreshController = new RefreshController(fetcher, listener, mirror);
6673

@@ -77,6 +84,7 @@ public static List<CommandParser> baseParsers(boolean isMinecraft) {
7784
new InfoParser(infoController),
7885
new InstallParser(installController),
7986
new RefreshParser(refreshController),
87+
new UninstallParser(uninstallController),
8088
new UpdateParser(updateController)
8189
);
8290
}
@@ -87,7 +95,8 @@ public static List<CommandParser> baseParsers(boolean isMinecraft) {
8795
* @return Returns a list of argument parsers that require the Server (Minecraft Bukkit Plugin) environment.
8896
*/
8997
public static List<CommandParser> serverParsers() {
90-
var loader = new PluginLoader();
98+
var jarFinder = new LocalJarFinder();
99+
var loader = new PluginLoader(jarFinder);
91100

92101
var loadController = new LoadController(loader);
93102
var reloadController = new ReloadController(loader);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.hydev.mcpm.client.arguments.parsers;
2+
3+
import net.sourceforge.argparse4j.impl.Arguments;
4+
import net.sourceforge.argparse4j.inf.Namespace;
5+
import net.sourceforge.argparse4j.inf.Subparser;
6+
import org.hydev.mcpm.client.commands.entries.UninstallController;
7+
import org.hydev.mcpm.client.injector.PluginNotFoundException;
8+
import org.hydev.mcpm.client.uninstall.UninstallResult;
9+
10+
import java.util.function.Consumer;
11+
12+
/**
13+
* Command parser for the uninstallation use case
14+
*
15+
* @author Anushka (https://github.com/aanushkasharma)
16+
* @since 2022-11-27
17+
*/
18+
public record UninstallParser(UninstallController controller) implements CommandParser {
19+
@Override
20+
public String name() {
21+
return "uninstall";
22+
}
23+
24+
@Override
25+
public String description() {
26+
return "Uninstall a plugin from file system";
27+
}
28+
29+
@Override
30+
public void configure(Subparser parser) {
31+
parser.addArgument("name")
32+
.help("Name of the plugin to uninstall");
33+
parser.addArgument("-r", "--recursive").action(Arguments.storeTrue())
34+
.help("Recursively remove orphan dependencies");
35+
}
36+
37+
@Override
38+
public void run(Namespace details, Consumer<String> log)
39+
{
40+
var name = details.getString("name");
41+
try {
42+
// Uninstall
43+
var result = controller.uninstall(name, details.getBoolean("recursive"));
44+
45+
// Print result
46+
if (result.state() == UninstallResult.State.FAILED_TO_DELETE) {
47+
log.accept("&cFailed to delete plugin file");
48+
}
49+
if (result.state() == UninstallResult.State.SUCCESS) {
50+
log.accept("&aPlugin " + name + " uninstalled successfully!");
51+
}
52+
}
53+
catch (PluginNotFoundException e) {
54+
log.accept("&cPlugin of the name " + name + " is not found");
55+
}
56+
}
57+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.hydev.mcpm.client.commands.entries;
2+
3+
import org.hydev.mcpm.client.injector.PluginNotFoundException;
4+
import org.hydev.mcpm.client.uninstall.UninstallBoundary;
5+
import org.hydev.mcpm.client.uninstall.UninstallInput;
6+
import org.hydev.mcpm.client.uninstall.UninstallResult;
7+
8+
/**
9+
* Controller for the uninstallation use case
10+
*
11+
* @author Anushka (https://github.com/aanushkasharma)
12+
* @since 2022-11-27
13+
*/
14+
public record UninstallController(UninstallBoundary boundary) {
15+
/**
16+
* Uninstall a plugin
17+
*
18+
* @param name Name of the plugin
19+
* @param recursive Whether to remove orphan dependencies
20+
* @return Uninstall result
21+
* @throws PluginNotFoundException Plugin not found
22+
*/
23+
public UninstallResult uninstall(String name, boolean recursive) throws PluginNotFoundException {
24+
return boundary.uninstall(new UninstallInput(name, recursive));
25+
}
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.hydev.mcpm.client.injector;
2+
3+
import java.io.File;
4+
5+
/**
6+
* Boundary for finding local jar files
7+
*
8+
* @author Azalea (https://github.com/hykilpikonna)
9+
* @since 2022-11-27
10+
*/
11+
public interface LocalJarBoundary
12+
{
13+
/**
14+
* Find a jar file of a plugin in file system by name
15+
*
16+
* @param name Plugin name in meta
17+
* @return Plugin jar file
18+
*/
19+
File findJar(String name) throws PluginNotFoundException;
20+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.hydev.mcpm.client.injector;
2+
3+
import org.hydev.mcpm.client.models.PluginYml;
4+
import org.hydev.mcpm.utils.PluginJarFile;
5+
6+
import java.io.File;
7+
import java.io.IOException;
8+
import java.util.Arrays;
9+
import java.util.Optional;
10+
11+
/**
12+
* Implementation that finds locally installed jars by name
13+
*
14+
* @param dir Plugins directory (default to "./plugins")
15+
* @author Azalea (https://github.com/hykilpikonna)
16+
* @since 2022-11-27
17+
*/
18+
public record LocalJarFinder(File dir) implements LocalJarBoundary
19+
{
20+
public LocalJarFinder()
21+
{
22+
this(new File("plugins"));
23+
}
24+
25+
@Override
26+
public File findJar(String name) throws PluginNotFoundException
27+
{
28+
// 1. Find plugin file by name
29+
if (!dir.isDirectory()) throw new PluginNotFoundException(name);
30+
return Arrays.stream(Optional.ofNullable(dir.listFiles()).orElseThrow(() -> new PluginNotFoundException(name)))
31+
.filter(f -> f.getName().endsWith(".jar"))
32+
.filter(f -> {
33+
try (var jf = new PluginJarFile(f))
34+
{
35+
return jf.readPluginYaml().name().equalsIgnoreCase(name);
36+
}
37+
catch (IOException | PluginYml.InvalidPluginMetaStructure ignored) { return false; }
38+
}).findFirst().orElseThrow(() -> new PluginNotFoundException(name));
39+
}
40+
}

src/main/java/org/hydev/mcpm/client/injector/PluginLoader.java

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
import org.bukkit.plugin.InvalidPluginException;
1111
import org.bukkit.plugin.Plugin;
1212
import org.bukkit.plugin.RegisteredListener;
13-
import org.hydev.mcpm.client.models.PluginYml;
14-
import org.hydev.mcpm.utils.PluginJarFile;
1513

1614
import java.io.File;
1715
import java.io.IOException;
1816
import java.net.URLClassLoader;
19-
import java.util.*;
17+
import java.util.Arrays;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.SortedSet;
2021

2122
import static org.hydev.mcpm.utils.ReflectionUtils.getPrivateField;
2223
import static org.hydev.mcpm.utils.ReflectionUtils.setPrivateField;
@@ -27,26 +28,12 @@
2728
* @author Azalea (https://github.com/hykilpikonna)
2829
* @since 2022-09-27
2930
*/
30-
public class PluginLoader implements LoadBoundary, UnloadBoundary, ReloadBoundary
31+
public record PluginLoader(LocalJarFinder jarFinder) implements LoadBoundary, UnloadBoundary, ReloadBoundary
3132
{
3233
@Override
3334
public boolean loadPlugin(String name) throws PluginNotFoundException
3435
{
35-
// 1. Find plugin file by name
36-
var dir = new File("plugins");
37-
if (!dir.isDirectory()) throw new PluginNotFoundException(name);
38-
var file = Arrays.stream(Optional.ofNullable(dir.listFiles())
39-
.orElseThrow(() -> new PluginNotFoundException(name)))
40-
.filter(f -> f.getName().endsWith(".jar"))
41-
.filter(f -> {
42-
try (var jf = new PluginJarFile(f))
43-
{
44-
return jf.readPluginYaml().name().equalsIgnoreCase(name);
45-
}
46-
catch (IOException | PluginYml.InvalidPluginMetaStructure ignored) { return false; }
47-
}).findFirst().orElseThrow(() -> new PluginNotFoundException(name));
48-
49-
return loadPlugin(file);
36+
return loadPlugin(jarFinder.findJar(name));
5037
}
5138

5239
@Override
@@ -74,13 +61,14 @@ public boolean loadPlugin(File jar)
7461
}
7562

7663
@Override
77-
public void unloadPlugin(String name) throws PluginNotFoundException
64+
public File unloadPlugin(String name) throws PluginNotFoundException
7865
{
79-
var pm = Bukkit.getPluginManager();
66+
final var pm = Bukkit.getPluginManager();
8067

8168
// 1. Find plugin by name
82-
var plugin = Arrays.stream(pm.getPlugins()).filter(p -> p.getName().equalsIgnoreCase(name)).findFirst()
69+
final var plugin = Arrays.stream(pm.getPlugins()).filter(p -> p.getName().equalsIgnoreCase(name)).findFirst()
8370
.orElseThrow(() -> new PluginNotFoundException(name));
71+
final var jar = new File(plugin.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
8472

8573
// 2. Unload plugin
8674
pm.disablePlugin(plugin);
@@ -127,6 +115,8 @@ public void unloadPlugin(String name) throws PluginNotFoundException
127115
e.printStackTrace();
128116
}
129117
}
118+
119+
return jar;
130120
}
131121

132122
@Override

src/main/java/org/hydev/mcpm/client/injector/UnloadBoundary.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.hydev.mcpm.client.injector;
22

3+
import java.io.File;
4+
35
/**
46
* Interface for unloading a locally installed plugin.
57
*
@@ -12,6 +14,8 @@ public interface UnloadBoundary
1214
* Dynamically unload a local plugin through JVM reflections and classloader hacks
1315
*
1416
* @param name Loaded plugin name
17+
* @return Jar file
18+
* @throws PluginNotFoundException If a loaded plugin of the name isn't found
1519
*/
16-
void unloadPlugin(String name) throws PluginNotFoundException;
20+
File unloadPlugin(String name) throws PluginNotFoundException;
1721
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.hydev.mcpm.client.uninstall;
2+
3+
import org.hydev.mcpm.client.injector.PluginNotFoundException;
4+
5+
/**
6+
* Uninstalls a plugin
7+
*/
8+
public interface UninstallBoundary {
9+
/**
10+
* Uninstalls plugin based on its given name
11+
*
12+
* @param input Uninstall input
13+
*/
14+
UninstallResult uninstall(UninstallInput input) throws PluginNotFoundException;
15+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.hydev.mcpm.client.uninstall;
2+
3+
/**
4+
* Uninstall Plugin input
5+
*
6+
* @param name Plugin name
7+
* @param recursive remove dependencies or not
8+
*/
9+
public record UninstallInput(
10+
String name,
11+
boolean recursive
12+
) { }
13+
14+

0 commit comments

Comments
 (0)