From c3ab4d3dcf3c096801d267adbb87a1dde3b232f1 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Fri, 9 Dec 2022 16:21:40 +0100 Subject: [PATCH 01/12] added temporary package class --- .../packageviewer/FedoraParser/Package.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/fr/packageviewer/FedoraParser/Package.java diff --git a/src/main/java/fr/packageviewer/FedoraParser/Package.java b/src/main/java/fr/packageviewer/FedoraParser/Package.java new file mode 100644 index 0000000..a678ba6 --- /dev/null +++ b/src/main/java/fr/packageviewer/FedoraParser/Package.java @@ -0,0 +1,20 @@ +package fr.packageviewer.FedoraParser; + +import java.util.List; + +public class Package { + String name; + String version; + String repo; + String description; + List deps; + + public Package(String name, String version, String repo, String desciption) { + this.name = name; + this.version = version; + this.repo = repo; + this.description = desciption; + } + + +} From 37f8e2ea36ce0bf17ee57bdd60177288f222c36f Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sat, 10 Dec 2022 13:28:12 +0100 Subject: [PATCH 02/12] refractored to respect specifications --- .../packageviewer/FedoraParser/Package.java | 21 +++++++------------ .../FedoraParser/SearchedPackage.java | 16 ++++++++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java diff --git a/src/main/java/fr/packageviewer/FedoraParser/Package.java b/src/main/java/fr/packageviewer/FedoraParser/Package.java index a678ba6..0af4d84 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/Package.java +++ b/src/main/java/fr/packageviewer/FedoraParser/Package.java @@ -2,19 +2,12 @@ package fr.packageviewer.FedoraParser; import java.util.List; -public class Package { - String name; - String version; - String repo; - String description; +public class Package extends SearchedPackage { List deps; - - public Package(String name, String version, String repo, String desciption) { - this.name = name; - this.version = version; - this.repo = repo; - this.description = desciption; + + public Package(String name, String version, String repo, String description, List deps) { + super(name, version, repo, description); + this.deps = deps; } - - -} + +} \ No newline at end of file diff --git a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java new file mode 100644 index 0000000..0a6ba6c --- /dev/null +++ b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java @@ -0,0 +1,16 @@ +package fr.packageviewer.FedoraParser; + +public class SearchedPackage { + String name; + String version; + String repo; + String description; + + public SearchedPackage(String name, String version, String repo, String desciption) { + this.name = name; + this.version = version; + this.repo = repo; + this.description = desciption; + } + +} \ No newline at end of file From acead35d21fb68086502ae5c666e26f32c990cb7 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sat, 10 Dec 2022 13:33:54 +0100 Subject: [PATCH 03/12] modified package structure for fedora + added search method --- src/main/java/fr/packageviewer/FedoraParser/Package.java | 4 +++- .../java/fr/packageviewer/FedoraParser/SearchedPackage.java | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/Package.java b/src/main/java/fr/packageviewer/FedoraParser/Package.java index 0af4d84..f69733b 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/Package.java +++ b/src/main/java/fr/packageviewer/FedoraParser/Package.java @@ -3,10 +3,12 @@ package fr.packageviewer.FedoraParser; import java.util.List; public class Package extends SearchedPackage { + String version; List deps; public Package(String name, String version, String repo, String description, List deps) { - super(name, version, repo, description); + super(name, repo, description); + this.version = version; this.deps = deps; } diff --git a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java index 0a6ba6c..1c42baf 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java +++ b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java @@ -2,13 +2,11 @@ package fr.packageviewer.FedoraParser; public class SearchedPackage { String name; - String version; String repo; String description; - public SearchedPackage(String name, String version, String repo, String desciption) { + public SearchedPackage(String name, String repo, String desciption) { this.name = name; - this.version = version; this.repo = repo; this.description = desciption; } From a8658f77bcac5cebf3e51f93fef62bb7fe515a7d Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sat, 10 Dec 2022 13:34:27 +0100 Subject: [PATCH 04/12] forgot to add file --- .../FedoraParser/FedoraParser.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java new file mode 100644 index 0000000..7e3114b --- /dev/null +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -0,0 +1,46 @@ +package fr.packageviewer.FedoraParser; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import java.net.http.*; +import org.json.*; + +public class FedoraParser { + + public List searchPackage(String packageName){ + + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern="+packageName)) + .build(); + + HttpResponse response; + try{ + response = client.send(request, HttpResponse.BodyHandlers.ofString()); + }catch(IOException|InterruptedException e){ + e.printStackTrace(); + return null; + } + + JSONObject json = new JSONObject(response.body()); + + List searchedPackagesList = new ArrayList<>(); + + // iterate for every package in the list + for (Object searchResultObj : json.getJSONArray("projects")) { + // convert object into String + JSONObject searchResultJson = (JSONObject) searchResultObj; + // add package into to list + searchedPackagesList.add(new SearchedPackage( + searchResultJson.getString("neofetch"), + searchResultJson.getString("fullname"), + searchResultJson.getString("description") + )); + } + return searchedPackagesList; + } +} \ No newline at end of file From 6454fd9d66b1dbec3187732e48151a3be95c34e4 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 11:34:06 +0100 Subject: [PATCH 05/12] started fedora parser --- .../FedoraParser/FedoraParser.java | 63 ++++++++++++++++--- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index 7e3114b..885b93d 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -4,24 +4,52 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; - +import java.util.Map; +import java.util.Scanner; import java.net.http.*; import org.json.*; public class FedoraParser { - public List searchPackage(String packageName){ - + private String getPackageFromAPI(String packageName) { + /* TODO + * + * Ok, to retrieve all the data we need about a package we get the + * .spec file at the repo's root. The thing is that for pacakges + * that didn't had an update for a long time, the branch "main" doesn't + * exist, it's "master", so in the future we'll need to address this + * case + * + */ + // create a new http client + HttpClient client = HttpClient.newHttpClient(); + // and create its url + HttpRequest request = HttpRequest.newBuilder(URI.create("https://src.fedoraproject.org/rpms/"+packageName+"/raw/main/f/"+packageName+".spec")).build(); + // send its url and return the string given + try { + return client.send(request, HttpResponse.BodyHandlers.ofString()).body(); + } catch (IOException|InterruptedException e) { + e.printStackTrace(); + } + // if there's an error, return an empty string + return ""; + } + + public List searchPackage(String packageName) { + HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create("https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern="+packageName)) + .uri(URI.create( + "https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern=" + + packageName)) .build(); HttpResponse response; - try{ + try { response = client.send(request, HttpResponse.BodyHandlers.ofString()); - }catch(IOException|InterruptedException e){ + } catch (IOException | InterruptedException e) { e.printStackTrace(); return null; } @@ -36,11 +64,26 @@ public class FedoraParser { JSONObject searchResultJson = (JSONObject) searchResultObj; // add package into to list searchedPackagesList.add(new SearchedPackage( - searchResultJson.getString("neofetch"), - searchResultJson.getString("fullname"), - searchResultJson.getString("description") - )); + searchResultJson.getString("neofetch"), + searchResultJson.getString("fullname"), + searchResultJson.getString("description"))); } return searchedPackagesList; } + + private Map parseSpecFile(String spec){ + Map results = new HashMap<>(); + spec.indexOf("%description"); + return results; + } + + public Package getPackageTree(String packageName, int depth) { + String name, version, repo, description; + List deps = new ArrayList<>(); + + // parse the json + String spec = getPackageFromAPI(packageName); + return new Package("name", "version", "repo", "description", deps); + } + } \ No newline at end of file From 734cd681912af4c1bdd3ee798b2035435028cdf4 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 12:13:59 +0100 Subject: [PATCH 06/12] parsable description and dependencies --- .../FedoraParser/FedoraParser.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index 885b93d..c5d0421 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -13,7 +13,7 @@ import org.json.*; public class FedoraParser { - private String getPackageFromAPI(String packageName) { + public String getPackageFromAPI(String packageName) { /* TODO * * Ok, to retrieve all the data we need about a package we get the @@ -71,9 +71,23 @@ public class FedoraParser { return searchedPackagesList; } - private Map parseSpecFile(String spec){ + public Map parseSpecFile(String spec){ Map results = new HashMap<>(); - spec.indexOf("%description"); + + // parse description + String descriptionStart = spec.substring(spec.indexOf("%description")+13); + String description = descriptionStart.substring(0,descriptionStart.indexOf("%")); + + // parse dependencies + int baseindex = spec.indexOf("\nRequires:"); + while(baseindex != -1){ + baseindex += 10; + while(spec.charAt(baseindex) == ' ')baseindex++; + String dep = spec.substring(baseindex,spec.indexOf("\n", baseindex)); + if(dep.contains(" ")) dep = dep.substring(0, dep.indexOf(" ")); + System.out.println(dep); + baseindex = spec.indexOf("\nRequires:",baseindex); + } return results; } From 3b3897abb3b8ef369e5dc1c87122f38d24867376 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 12:53:30 +0100 Subject: [PATCH 07/12] finished spec parser --- .../FedoraParser/FedoraParser.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index c5d0421..8505f67 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -21,6 +21,8 @@ public class FedoraParser { * that didn't had an update for a long time, the branch "main" doesn't * exist, it's "master", so in the future we'll need to address this * case + * + * Handle 404 errors lol * */ // create a new http client @@ -71,24 +73,45 @@ public class FedoraParser { return searchedPackagesList; } - public Map parseSpecFile(String spec){ - Map results = new HashMap<>(); + public JSONObject parseSpecFile(String spec){ + JSONObject json = new JSONObject(); + + // resolve macros + int baseindex = spec.indexOf("%define"); + while(baseindex != -1){ + baseindex += 8; + while(spec.charAt(baseindex) == ' ')baseindex++; + String macroName = spec.substring(baseindex, spec.indexOf(" ", baseindex)); + String macroValue = spec.substring(spec.indexOf(" ", baseindex),spec.indexOf("\n", baseindex)).trim(); + spec = spec.replaceAll("%\\{"+ macroName +"\\}", macroValue); + baseindex = spec.indexOf("%define",baseindex); + } + + // parse version + int index = spec.indexOf("Version:")+8; + String version = spec.substring(index, spec.indexOf("\n",index)).trim(); // parse description - String descriptionStart = spec.substring(spec.indexOf("%description")+13); - String description = descriptionStart.substring(0,descriptionStart.indexOf("%")); + index = spec.indexOf("%description")+13; + String description = spec.substring(index,spec.indexOf("%",index)); // parse dependencies - int baseindex = spec.indexOf("\nRequires:"); + baseindex = spec.indexOf("\nRequires:"); + JSONArray depedencies = new JSONArray(); while(baseindex != -1){ baseindex += 10; while(spec.charAt(baseindex) == ' ')baseindex++; String dep = spec.substring(baseindex,spec.indexOf("\n", baseindex)); if(dep.contains(" ")) dep = dep.substring(0, dep.indexOf(" ")); - System.out.println(dep); + depedencies.put(dep); baseindex = spec.indexOf("\nRequires:",baseindex); } - return results; + + json.put("depedencies", depedencies); + json.put("description", description); + json.put("version",version); + System.out.println(json); + return json; } public Package getPackageTree(String packageName, int depth) { From e489959886c1e85d2f2c11626896826e299b1cc5 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 15:44:23 +0100 Subject: [PATCH 08/12] address problematic edge-cases --- .../FedoraParser/FedoraParser.java | 53 ++++++++++++++----- .../packageviewer/FedoraParser/Package.java | 18 ++++++- .../FedoraParser/SearchedPackage.java | 24 +++++++++ 3 files changed, 82 insertions(+), 13 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index 8505f67..bd93799 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -28,10 +28,13 @@ public class FedoraParser { // create a new http client HttpClient client = HttpClient.newHttpClient(); // and create its url - HttpRequest request = HttpRequest.newBuilder(URI.create("https://src.fedoraproject.org/rpms/"+packageName+"/raw/main/f/"+packageName+".spec")).build(); + String url = "https://src.fedoraproject.org/rpms/"+packageName+"/raw/main/f/"+packageName+".spec"; + HttpRequest request = HttpRequest.newBuilder(URI.create(url)).build(); // send its url and return the string given try { - return client.send(request, HttpResponse.BodyHandlers.ofString()).body(); + String response = client.send(request, HttpResponse.BodyHandlers.ofString()).body(); + if(response.contains("")) return ""; + return response; } catch (IOException|InterruptedException e) { e.printStackTrace(); } @@ -75,8 +78,8 @@ public class FedoraParser { public JSONObject parseSpecFile(String spec){ JSONObject json = new JSONObject(); - - // resolve macros + if (spec == "") return json; + // resolve macros int baseindex = spec.indexOf("%define"); while(baseindex != -1){ baseindex += 8; @@ -90,27 +93,32 @@ public class FedoraParser { // parse version int index = spec.indexOf("Version:")+8; String version = spec.substring(index, spec.indexOf("\n",index)).trim(); - + // parse description index = spec.indexOf("%description")+13; String description = spec.substring(index,spec.indexOf("%",index)); + // parse name + index = spec.indexOf("Name:")+5; + String name = spec.substring(index, spec.indexOf("\n",index)).trim(); + // parse dependencies baseindex = spec.indexOf("\nRequires:"); JSONArray depedencies = new JSONArray(); while(baseindex != -1){ baseindex += 10; - while(spec.charAt(baseindex) == ' ')baseindex++; + while(spec.charAt(baseindex) == ' '|spec.charAt(baseindex) == '\t')baseindex++; String dep = spec.substring(baseindex,spec.indexOf("\n", baseindex)); if(dep.contains(" ")) dep = dep.substring(0, dep.indexOf(" ")); - depedencies.put(dep); + if(!dep.contains("%")){; + depedencies.put(dep); + } baseindex = spec.indexOf("\nRequires:",baseindex); } - + json.put("name", name); json.put("depedencies", depedencies); json.put("description", description); json.put("version",version); - System.out.println(json); return json; } @@ -119,8 +127,29 @@ public class FedoraParser { List deps = new ArrayList<>(); // parse the json - String spec = getPackageFromAPI(packageName); - return new Package("name", "version", "repo", "description", deps); - } + JSONObject json = parseSpecFile(getPackageFromAPI(packageName)); + if(json.isEmpty()){ + return new Package(packageName+"(not found)", "N/A", "N/A", "N/A", Collections.emptyList()); + } + // get infos except dependencies + name = json.getString("name"); + version = json.getString("version"); + repo = "rpms/"+packageName; + description = json.getString("description"); + // if we're at the maximum depth, return the package without its dependencies + if(depth==0){ + return new Package(name, version, repo, description, Collections.emptyList()); + } + else { + // iterate for every package in the list + for (Object depPackageNameObj : json.getJSONArray("depedencies")) { + // convert object into String + String depPackageName = (String) depPackageNameObj; + // add package into Package List + deps.add(getPackageTree(depPackageName, depth - 1)); + } + return new Package(name, version, repo, description, deps); + } + } } \ No newline at end of file diff --git a/src/main/java/fr/packageviewer/FedoraParser/Package.java b/src/main/java/fr/packageviewer/FedoraParser/Package.java index f69733b..66a53a3 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/Package.java +++ b/src/main/java/fr/packageviewer/FedoraParser/Package.java @@ -4,7 +4,7 @@ import java.util.List; public class Package extends SearchedPackage { String version; - List deps; + public List deps; public Package(String name, String version, String repo, String description, List deps) { super(name, repo, description); @@ -12,4 +12,20 @@ public class Package extends SearchedPackage { this.deps = deps; } + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getDeps() { + return deps; + } + + public void setDeps(List deps) { + this.deps = deps; + } + } \ No newline at end of file diff --git a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java index 1c42baf..809942b 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java +++ b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java @@ -11,4 +11,28 @@ public class SearchedPackage { this.description = desciption; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRepo() { + return repo; + } + + public void setRepo(String repo) { + this.repo = repo; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } \ No newline at end of file From 740f1e42a08b1381787fff78aef42684fe85a7c2 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 16:00:49 +0100 Subject: [PATCH 09/12] discorved more problematic edge cases --- .../fr/packageviewer/FedoraParser/FedoraParser.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index bd93799..3ff7a36 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -89,6 +89,16 @@ public class FedoraParser { spec = spec.replaceAll("%\\{"+ macroName +"\\}", macroValue); baseindex = spec.indexOf("%define",baseindex); } + baseindex = spec.indexOf("%global"); + while(baseindex != -1){ + baseindex += 7; + while(spec.charAt(baseindex) == ' ')baseindex++; + String macroName = spec.substring(baseindex, spec.indexOf(" ", baseindex)); + String macroValue = spec.substring(spec.indexOf(" ", baseindex),spec.indexOf("\n", baseindex)).trim(); + spec = spec.replace("%{"+macroName +"}", macroValue); + baseindex = spec.indexOf("%global",baseindex); + + } // parse version int index = spec.indexOf("Version:")+8; From 2252063176386b529c04609a045f7015f44f3e71 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 11 Dec 2022 16:57:45 +0100 Subject: [PATCH 10/12] refractored to use a better api --- .../FedoraParser/FedoraParser.java | 90 +++---------------- 1 file changed, 14 insertions(+), 76 deletions(-) diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java index 3ff7a36..0b8e3cc 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java @@ -14,26 +14,15 @@ import org.json.*; public class FedoraParser { public String getPackageFromAPI(String packageName) { - /* TODO - * - * Ok, to retrieve all the data we need about a package we get the - * .spec file at the repo's root. The thing is that for pacakges - * that didn't had an update for a long time, the branch "main" doesn't - * exist, it's "master", so in the future we'll need to address this - * case - * - * Handle 404 errors lol - * - */ // create a new http client HttpClient client = HttpClient.newHttpClient(); // and create its url - String url = "https://src.fedoraproject.org/rpms/"+packageName+"/raw/main/f/"+packageName+".spec"; + String url = "https://mdapi.fedoraproject.org/rawhide/pkg/"+packageName+""; HttpRequest request = HttpRequest.newBuilder(URI.create(url)).build(); // send its url and return the string given try { String response = client.send(request, HttpResponse.BodyHandlers.ofString()).body(); - if(response.contains("")) return ""; + if(response.contains("404: Not Found")) return ""; return response; } catch (IOException|InterruptedException e) { e.printStackTrace(); @@ -47,8 +36,8 @@ public class FedoraParser { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create( - "https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern=" - + packageName)) + "https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern=*" + + packageName+"*")) .build(); HttpResponse response; @@ -76,73 +65,19 @@ public class FedoraParser { return searchedPackagesList; } - public JSONObject parseSpecFile(String spec){ - JSONObject json = new JSONObject(); - if (spec == "") return json; - // resolve macros - int baseindex = spec.indexOf("%define"); - while(baseindex != -1){ - baseindex += 8; - while(spec.charAt(baseindex) == ' ')baseindex++; - String macroName = spec.substring(baseindex, spec.indexOf(" ", baseindex)); - String macroValue = spec.substring(spec.indexOf(" ", baseindex),spec.indexOf("\n", baseindex)).trim(); - spec = spec.replaceAll("%\\{"+ macroName +"\\}", macroValue); - baseindex = spec.indexOf("%define",baseindex); - } - baseindex = spec.indexOf("%global"); - while(baseindex != -1){ - baseindex += 7; - while(spec.charAt(baseindex) == ' ')baseindex++; - String macroName = spec.substring(baseindex, spec.indexOf(" ", baseindex)); - String macroValue = spec.substring(spec.indexOf(" ", baseindex),spec.indexOf("\n", baseindex)).trim(); - spec = spec.replace("%{"+macroName +"}", macroValue); - baseindex = spec.indexOf("%global",baseindex); - - } - - // parse version - int index = spec.indexOf("Version:")+8; - String version = spec.substring(index, spec.indexOf("\n",index)).trim(); - - // parse description - index = spec.indexOf("%description")+13; - String description = spec.substring(index,spec.indexOf("%",index)); - - // parse name - index = spec.indexOf("Name:")+5; - String name = spec.substring(index, spec.indexOf("\n",index)).trim(); - - // parse dependencies - baseindex = spec.indexOf("\nRequires:"); - JSONArray depedencies = new JSONArray(); - while(baseindex != -1){ - baseindex += 10; - while(spec.charAt(baseindex) == ' '|spec.charAt(baseindex) == '\t')baseindex++; - String dep = spec.substring(baseindex,spec.indexOf("\n", baseindex)); - if(dep.contains(" ")) dep = dep.substring(0, dep.indexOf(" ")); - if(!dep.contains("%")){; - depedencies.put(dep); - } - baseindex = spec.indexOf("\nRequires:",baseindex); - } - json.put("name", name); - json.put("depedencies", depedencies); - json.put("description", description); - json.put("version",version); - return json; - } public Package getPackageTree(String packageName, int depth) { String name, version, repo, description; List deps = new ArrayList<>(); // parse the json - JSONObject json = parseSpecFile(getPackageFromAPI(packageName)); - if(json.isEmpty()){ + String response = getPackageFromAPI(packageName); + if(response == ""){ return new Package(packageName+"(not found)", "N/A", "N/A", "N/A", Collections.emptyList()); } + JSONObject json = new JSONObject(response); // get infos except dependencies - name = json.getString("name"); + name = json.getString("basename"); version = json.getString("version"); repo = "rpms/"+packageName; description = json.getString("description"); @@ -153,11 +88,14 @@ public class FedoraParser { } else { // iterate for every package in the list - for (Object depPackageNameObj : json.getJSONArray("depedencies")) { + for (Object depPackageNameObj : json.getJSONArray("requires")) { // convert object into String - String depPackageName = (String) depPackageNameObj; + JSONObject depPackageJSONObj = (JSONObject) depPackageNameObj; // add package into Package List - deps.add(getPackageTree(depPackageName, depth - 1)); + String depName = depPackageJSONObj.getString("name"); + if(depName.contains(".so")) continue; + if(depName.contains("/")) continue; + deps.add(getPackageTree(depName, depth - 1)); } return new Package(name, version, repo, description, deps); } From c8eae1fb063e070a27162bcc0401252318b37e3a Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Tue, 13 Dec 2022 15:59:40 +0100 Subject: [PATCH 11/12] refactored for async use --- .../packageviewer/FedoraParser/Package.java | 31 ------------ .../FedoraParser/SearchedPackage.java | 38 --------------- .../FedoraDistribution.java} | 47 ++++++++++++------- 3 files changed, 31 insertions(+), 85 deletions(-) delete mode 100644 src/main/java/fr/packageviewer/FedoraParser/Package.java delete mode 100644 src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java rename src/main/java/fr/packageviewer/{FedoraParser/FedoraParser.java => distribution/FedoraDistribution.java} (74%) diff --git a/src/main/java/fr/packageviewer/FedoraParser/Package.java b/src/main/java/fr/packageviewer/FedoraParser/Package.java deleted file mode 100644 index 66a53a3..0000000 --- a/src/main/java/fr/packageviewer/FedoraParser/Package.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.packageviewer.FedoraParser; - -import java.util.List; - -public class Package extends SearchedPackage { - String version; - public List deps; - - public Package(String name, String version, String repo, String description, List deps) { - super(name, repo, description); - this.version = version; - this.deps = deps; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public List getDeps() { - return deps; - } - - public void setDeps(List deps) { - this.deps = deps; - } - -} \ No newline at end of file diff --git a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java b/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java deleted file mode 100644 index 809942b..0000000 --- a/src/main/java/fr/packageviewer/FedoraParser/SearchedPackage.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.packageviewer.FedoraParser; - -public class SearchedPackage { - String name; - String repo; - String description; - - public SearchedPackage(String name, String repo, String desciption) { - this.name = name; - this.repo = repo; - this.description = desciption; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getRepo() { - return repo; - } - - public void setRepo(String repo) { - this.repo = repo; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - -} \ No newline at end of file diff --git a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java similarity index 74% rename from src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java rename to src/main/java/fr/packageviewer/distribution/FedoraDistribution.java index 0b8e3cc..f4b1bc8 100644 --- a/src/main/java/fr/packageviewer/FedoraParser/FedoraParser.java +++ b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java @@ -1,4 +1,4 @@ -package fr.packageviewer.FedoraParser; +package fr.packageviewer.distribution; import java.io.IOException; import java.net.URI; @@ -10,10 +10,16 @@ import java.util.Map; import java.util.Scanner; import java.net.http.*; import org.json.*; +import java.util.concurrent.CompletableFuture; +import fr.packageviewer.pack.Package; +import fr.packageviewer.pack.SearchedPackage; +import fr.packageviewer.LoggerManager; +import fr.packageviewer.pack.Package; +import fr.packageviewer.pack.SearchedPackage; -public class FedoraParser { +public class FedoraDistribution implements Distribution { - public String getPackageFromAPI(String packageName) { + private String getPackageFromAPI(String packageName) { // create a new http client HttpClient client = HttpClient.newHttpClient(); // and create its url @@ -26,18 +32,20 @@ public class FedoraParser { return response; } catch (IOException|InterruptedException e) { e.printStackTrace(); + } // if there's an error, return an empty string return ""; } - + + @Override public List searchPackage(String packageName) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create( "https://src.fedoraproject.org/api/0/projects?namepace=rpms&per_page=100&short=true&pattern=*" - + packageName+"*")) + + packageName + "*")) .build(); HttpResponse response; @@ -59,45 +67,52 @@ public class FedoraParser { // add package into to list searchedPackagesList.add(new SearchedPackage( searchResultJson.getString("neofetch"), + null, searchResultJson.getString("fullname"), searchResultJson.getString("description"))); } return searchedPackagesList; } - - public Package getPackageTree(String packageName, int depth) { + public Package getPackageTreeInternal(String packageName, int depth) { String name, version, repo, description; List deps = new ArrayList<>(); // parse the json String response = getPackageFromAPI(packageName); - if(response == ""){ - return new Package(packageName+"(not found)", "N/A", "N/A", "N/A", Collections.emptyList()); + if (response == "") { + return new Package(packageName + "(not found)", "N/A", "N/A", "N/A", Collections.emptyList()); } JSONObject json = new JSONObject(response); // get infos except dependencies name = json.getString("basename"); version = json.getString("version"); - repo = "rpms/"+packageName; + repo = "rpms/" + packageName; description = json.getString("description"); // if we're at the maximum depth, return the package without its dependencies - if(depth==0){ + if (depth == 0) { return new Package(name, version, repo, description, Collections.emptyList()); - } - else { + } else { // iterate for every package in the list for (Object depPackageNameObj : json.getJSONArray("requires")) { // convert object into String JSONObject depPackageJSONObj = (JSONObject) depPackageNameObj; // add package into Package List String depName = depPackageJSONObj.getString("name"); - if(depName.contains(".so")) continue; - if(depName.contains("/")) continue; + if (depName.contains(".so")) + continue; + if (depName.contains("/")) + continue; deps.add(getPackageTree(depName, depth - 1)); } return new Package(name, version, repo, description, deps); } } -} \ No newline at end of file + + public CompletableFuture getPackageTree(String packageName, int depth){ + return CompletableFuture.supplyAsync(()->{ + return getPackageTreeInternal(packageName, depth); + }); + } +} From 00ff7ff6d84ad6421c5b12021eda064474b5d816 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Tue, 13 Dec 2022 16:06:23 +0100 Subject: [PATCH 12/12] fix recursive call --- .../java/fr/packageviewer/distribution/FedoraDistribution.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java index f4b1bc8..3969589 100644 --- a/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java +++ b/src/main/java/fr/packageviewer/distribution/FedoraDistribution.java @@ -104,7 +104,7 @@ public class FedoraDistribution implements Distribution { continue; if (depName.contains("/")) continue; - deps.add(getPackageTree(depName, depth - 1)); + deps.add(getPackageTreeInternal(depName, depth - 1)); } return new Package(name, version, repo, description, deps); }