Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Uninstall backup #83

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 50 additions & 5 deletions src/main/java/org/hydev/mcpm/client/Downloader.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,22 @@ public class Downloader
*/
public void downloadFile(String url, File to)
{
// TODO: Implement this
//throw new UnsupportedOperationException("TODO");
try (FileOutputStream fileos = new FileOutputStream(to)) {
URL link = new URL(url);
HttpURLConnection http = (HttpURLConnection) link.openConnection();
long fileSize = http.getContentLengthLong();
long fileSize = (long) http.getContentLengthLong();


BufferedInputStream in = new BufferedInputStream(http.getInputStream());
BufferedOutputStream bout = new BufferedOutputStream(fileos, 1024);
byte[] buffer = new byte[1024];
int read;
int read = 0;

var row = new ProgressRow(fileSize)
.desc(format("Download %s", allRows.size()))
.unit("Byte")
.desc(format("Downloaded", allRows.size()))
.descLen(30);
bar.appendBar(row);
allRows.add(row);
Expand All @@ -67,6 +70,7 @@ public void downloadFile(String url, File to)
}
bout.close();
in.close();
System.out.println("\nDownload completed");
}
catch (IOException ex) {
ex.printStackTrace();
Expand All @@ -80,7 +84,7 @@ public void downloadFile(String url, File to)
*
* @param urls Mapping of remote urls to local file paths
*/
public void downloadFiles(Map<String, File> urls)
public void downloadFiles(Map<String, File> urls, boolean progress, int threads)
{
try (ExecutorService executor = Executors.newFixedThreadPool(threads))
{
Expand Down Expand Up @@ -128,6 +132,36 @@ public Downloader threads(int threads)
return this;
}

class Processor implements Runnable {
private List<String> files;
private Map<String, File> urls;
private int id;

/**
* Download multiple files from the internet to local storage through HTTP requests
* <p>
* The implementation must use multithreading
*
* @param files List of remote urls
* @param urls Mapping of remote urls to local file paths
* @param id id for each file
*/
public Processor(int id, Map<String, File> urls, List<String> files) {
this.id = id;
this.urls = urls;
this.files = files;
}

// Process downloading each file from multithreading
@Override
public void run() {
String url = files.get(id);
File to = urls.get(url);
downloadFile(url, to);
}
}


/**
* Displays a demo for.
*
Expand All @@ -139,10 +173,21 @@ public static void main(String[] args) throws IOException {
File out = new File("./Introduction_to_Algorithms_Third_Edition.pdf");
String link1 = "https://www.iusb.edu/students/academic-success-programs/academic-centers-for-excellence/docs/Basic%20Math%20Review%20Card.pdf";
File out1 = new File("./Math.pdf");
String link2 = "https://ouopentextbooks.org/mathematics/files/2015/07/1503.pdf";
File out2 = new File("./1503");
String link3 = "https://faculty.math.illinois.edu/~aydin/math220/lecturenotes/m220_Sec1_4.pdf";
File out3 = new File("./m220_Sec1_4");
String link4 = "https://ocw.mit.edu/ans7870/9/9.00SC/MIT9_00SCF11_text.pdf";
File out4 = new File("./MIT9_00SCF11_text");

Downloader downloader = new Downloader();
Map<String, File> urls = new HashMap<>();
urls.put(link, out);
urls.put(link1, out1);
downloader.downloadFiles(urls);
urls.put(link2, out2);
urls.put(link3, out3);
urls.put(link4, out4);
downloader.downloadFiles(urls, true, 2);

}
}
10 changes: 10 additions & 0 deletions src/main/java/org/hydev/mcpm/client/Launcher.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package org.hydev.mcpm.client;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
* TODO: Write a description for this class!
*
Expand All @@ -10,5 +14,11 @@ public class Launcher
{
public static void main(String[] args) {
System.out.println("Meow");
File dir = new File("plugins");
File[] directoryListing = dir.listFiles();
for (File child : directoryListing) {
System.out.println(child.getName());
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,18 @@ public class LocalPluginTracker implements PluginTracker
private String pluginDirectory = "TODO: Get this path";

// Constructor
public LocalPluginTracker(String mainLockFileUrl, String pluginDirectoryUrl)
{
this.mainLockFile = mainLockFileUrl;
this.pluginDirectory = pluginDirectoryUrl;
public LocalPluginTracker() {
}

/**
* Instantiates a LocalPluginTracker with custom parameters for testing or
*
* @param mainLockFile The path to the main lock file
* @param pluginDirectory The path to the plugin directory
*/
public LocalPluginTracker(String mainLockFile, String pluginDirectory) {
this.mainLockFile = mainLockFile;
this.pluginDirectory = pluginDirectory;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ private void forceUpdate()
if (istty) cu.curUp(activeBars.size());
activeBars.forEach(bar -> {
cu.eraseLine();
out.println(bar.toString(theme, cols));
out.print(bar.toString(theme, cols));
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.hydev.mcpm.client.uninstallUseCase;

import org.hydev.mcpm.client.database.LocalPluginTracker;
import org.hydev.mcpm.client.database.fetcher.LocalDatabaseFetcher;
import org.hydev.mcpm.client.database.results.SearchPackagesResult;
import org.hydev.mcpm.client.injector.PluginNotFoundException;

/**
* Uninstalls a plugin
*/
public interface UninstallBoundary {
/**
* Uninstalls plugin based on its given name
* @param name given name of plugin
*/

public UninstallResult uninstallPlugin(UninstallInput input,
LocalPluginTracker lpt, LocalDatabaseFetcher ldf, DatabaseManager dbManage,
SearchPackagesResult spr) throws PluginNotFoundException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.hydev.mcpm.client.uninstallUseCase;

import org.hydev.mcpm.client.injector.PluginLoader;
import org.hydev.mcpm.client.injector.UnloadBoundary;

/**
* Uninstall Plugin input
*
* @param name Plugin name
* @param ulb PluginLoader object
* @param spType SearchPackagesType
* @param remove_depen remove dependencies or not
*/
public record UninstallInput(String name,
PluginLoader ulb,
SearchPackagesType spType,
boolean remove_depen){

}



132 changes: 132 additions & 0 deletions src/main/java/org/hydev/mcpm/client/uninstallUseCase/Uninstaller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package org.hydev.mcpm.client.uninstallUseCase;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;

import org.hydev.mcpm.client.commands.entries.UnloadController;
import org.hydev.mcpm.client.database.LocalPluginTracker;
import org.hydev.mcpm.client.database.PluginTracker;
import org.hydev.mcpm.client.database.boundary.SearchPackagesBoundary;
import org.hydev.mcpm.client.database.fetcher.LocalDatabaseFetcher;
import org.hydev.mcpm.client.database.results.SearchPackagesResult;
import org.hydev.mcpm.client.injector.LoadBoundary;
import org.hydev.mcpm.client.injector.PluginLoader;
import org.hydev.mcpm.client.injector.PluginNotFoundException;
import org.hydev.mcpm.client.injector.UnloadBoundary;
import org.hydev.mcpm.client.models.PluginModel;





public class Uninstaller implements UninstallBoundary {
public UninstallResult main(UninstallInput input) throws PluginNotFoundException {
LocalPluginTracker lpt = new LocalPluginTracker();
LocalDatabaseFetcher ldf = new LocalDatabaseFetcher(URI.create("http://mcpm.hydev.org"));
SearchInteractor searchInteract = new SearchInteractor(ldf);
DatabaseManager dbManage = new DatabaseManager(lpt, searchInteract);
InstallInput installInputCheckExistence = new InstallInput(input.name(),
input.spType(), Arrays.asList(lpt.listManuallyInstalled()).contains(input.name()), false);
// must create InstallInput object dince DatabaseManager.getSearchResult takes InstallInput only
SearchPackagesResult spr = dbManage.getSearchResult(installInputCheckExistence);
UninstallResult final_result = uninstallPlugin(input,lpt, ldf, dbManage,spr);

if (!input.remove_depen()) {
return final_result;
}
else {
PluginModel pluginModel = spr.plugins().get(0);
var pluginVers = pluginModel.getLatestPluginVersion().orElse(null);
if (pluginModel.getLatestPluginVersion().equals(null) ) {
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
}
if (pluginVers.meta().depend() != null) {
var pluginsDependencies = pluginVers.meta().depend();
if(removeDepend(pluginsDependencies)) { // at least one failure
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
}


}


}
return new UninstallResult(UninstallResult.State.SUCCESS);
}


public UninstallResult uninstallPlugin
(UninstallInput input, LocalPluginTracker lpt, LocalDatabaseFetcher ldf, DatabaseManager dbManage,
SearchPackagesResult spr)
throws PluginNotFoundException {
// 1. Check if plugin exists
if (spr.state() != State.SUCCESS) {
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
} else if (spr.plugins().isEmpty()) {
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
}
// 2. Uninstall the plugin
// a. unload plugin
// PluginLoader pil = new PluginLoader();
// pil.unloadPlugin(name);
input.ulb().unloadPlugin(input.name());
// b. remove local file
var plugins_folder = new File("plugins");
var plugins = Arrays.stream((plugins_folder.listFiles()))
.filter(plugin -> plugin.getName().endsWith(input.name() + ".jar"));

if (plugins.toList().isEmpty()) {
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
} else {
File file = new File(plugins.toArray()[0].toString());
if (!file.delete()) {
return new UninstallResult(UninstallResult.State.LOCATING_PLUGIN_FAILURE);
} else {
// c. remove from manually installed list
lpt.removeManuallyInstalled(input.name());
}


}



return new UninstallResult(UninstallResult.State.SUCCESS);
}
public boolean removeDepend (ArrayList<String> pluginsDependencies) throws PluginNotFoundException {
LocalPluginTracker lpt = new LocalPluginTracker();
LocalDatabaseFetcher ldf = new LocalDatabaseFetcher(URI.create("http://mcpm.hydev.org"));
SearchInteractor searchInteract = new SearchInteractor(ldf);
DatabaseManager dbManage = new DatabaseManager(lpt, searchInteract);
var manuallyInstalled = lpt.listManuallyInstalled();
var results = new ArrayList<UninstallResult>();
for (String dependency:pluginsDependencies) {
if (!Arrays.asList(manuallyInstalled).contains(dependency)) {
PluginLoader ulb = new PluginLoader();
UninstallInput dependInput = new UninstallInput(dependency,ulb,SearchPackagesType.BY_NAME,
false);
InstallInput installDependInputCheckExistence = new InstallInput(dependInput.name(),
dependInput.spType(), Arrays.asList(lpt.listManuallyInstalled()).contains(dependInput.name()), false);

SearchPackagesResult spr = dbManage.getSearchResult(installDependInputCheckExistence);
var result = uninstallPlugin(dependInput, lpt, ldf, dbManage, spr);
results.add(result);


}
}
return Arrays.asList(results).contains(UninstallResult.State.LOCATING_PLUGIN_FAILURE);

}








}