refractored to use a better api
This commit is contained in:
parent
740f1e42a0
commit
2252063176
@ -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("<!DOCTYPE html>")) 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<String> 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<Package> 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user