diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreFetch.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreFetch.java index dd93474..f6b73fc 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreFetch.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreFetch.java @@ -1,4 +1,48 @@ package gearth.services.internal_extensions.extensionstore.repository; +import gearth.services.internal_extensions.extensionstore.repository.models.StoreConfig; +import gearth.services.internal_extensions.extensionstore.repository.models.StoreData; +import org.apache.commons.io.IOUtils; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + public class StoreFetch { + + public interface StoreFetchListener { + + void success(StoreRepository storeRepository); + void fail(String reason); + + } + + public static void fetch(String version, StoreFetchListener storeFetchListener) { + + new Thread(() -> { + try { + JSONObject config = new JSONObject(IOUtils.toString( + new URL(String.format("https://raw.githubusercontent.com/sirjonasxx/G-ExtensionStore/repo/%s/store/config.json", version)) + .openStream(), StandardCharsets.UTF_8)); + + JSONArray exensions = new JSONArray(IOUtils.toString( + new URL(String.format("https://raw.githubusercontent.com/sirjonasxx/G-ExtensionStore/repo/%s/.auto-generated/extensions.json", version)) + .openStream(), StandardCharsets.UTF_8)); + + storeFetchListener.success(new StoreRepository(new StoreData(config, exensions), version)); + + } catch (Exception e) { + storeFetchListener.fail(e.getLocalizedMessage()); + } + }).start(); + + } + + + public static void main(String[] args) { +// get("1.4.1"); + } + } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreRepository.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreRepository.java index c73d643..bb64008 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreRepository.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/StoreRepository.java @@ -1,9 +1,6 @@ package gearth.services.internal_extensions.extensionstore.repository; -import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory; -import gearth.services.internal_extensions.extensionstore.repository.models.ExtFramework; -import gearth.services.internal_extensions.extensionstore.repository.models.StoreData; -import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension; +import gearth.services.internal_extensions.extensionstore.repository.models.*; import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering; import java.util.*; @@ -11,18 +8,22 @@ import java.util.stream.Collectors; public class StoreRepository { + public static StoreRepository EMPTY = new StoreRepository(new StoreData(new StoreConfig(new ArrayList<>(), new ArrayList<>()), new ArrayList<>()), "0.0"); + + private final String repoVersion; private final StoreData storeData; - public StoreRepository(StoreData storeData) { + public StoreRepository(StoreData storeData, String repoVersion) { + this.repoVersion = repoVersion; this.storeData = storeData; } public List getCategories() { - return storeData.getCategories(); + return storeData.getConfig().getCategories(); } public List getFrameworks() { - return storeData.getFrameworks(); + return storeData.getConfig().getFrameworks(); } public List getExtensions() { @@ -72,7 +73,7 @@ public class StoreRepository { public List getLanguages() { Set languages = new HashSet<>(); - storeData.getFrameworks().forEach(extFramework -> languages.addAll(extFramework.getLanguages())); + getFrameworks().forEach(extFramework -> languages.addAll(extFramework.getLanguages())); return new ArrayList<>(languages); } @@ -99,6 +100,10 @@ public class StoreRepository { public List getOrderings() { return Arrays.asList(ExtensionOrdering.values()); } + + public String getRepoVersion() { + return repoVersion; + } } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtCategory.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtCategory.java index 1daa1b2..856f4e6 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtCategory.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtCategory.java @@ -1,5 +1,7 @@ package gearth.services.internal_extensions.extensionstore.repository.models; +import org.json.JSONObject; + public class ExtCategory { private final String name; @@ -12,6 +14,12 @@ public class ExtCategory { this.icon = icon; } + public ExtCategory(JSONObject object) { + this.name = object.getString("name"); + this.description = object.getString("description"); + this.icon = object.getString("icon"); + } + public String getName() { return name; } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtFramework.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtFramework.java index 7ef267a..035707e 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtFramework.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/ExtFramework.java @@ -1,6 +1,9 @@ package gearth.services.internal_extensions.extensionstore.repository.models; +import org.json.JSONObject; + import java.util.List; +import java.util.stream.Collectors; public class ExtFramework { @@ -21,6 +24,16 @@ public class ExtFramework { this.installationInstructions = installationInstructions; } + public ExtFramework(JSONObject object) { + this.name = object.getString("name"); + this.developers = object.getJSONArray("developers").toList().stream().map(s -> (String)s).collect(Collectors.toList()); + this.languages = object.getJSONArray("languages").toList().stream().map(s -> (String)s).collect(Collectors.toList()); + this.source = object.getString("source"); + this.installationRequired = object.getJSONObject("installation").getBoolean("required"); + this.installationInstructions = object.getJSONObject("installation").has("instructions") ? + object.getJSONObject("installation").getString("instructions") : null; + } + public String getName() { return name; } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreConfig.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreConfig.java new file mode 100644 index 0000000..ab889e2 --- /dev/null +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreConfig.java @@ -0,0 +1,31 @@ +package gearth.services.internal_extensions.extensionstore.repository.models; + +import org.json.JSONObject; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class StoreConfig { + + private final List categories; + private final List frameworks; + + public StoreConfig(List categories, List frameworks) { + this.categories = categories; + this.frameworks = frameworks; + } + + public StoreConfig(JSONObject object) { + this.categories = object.getJSONArray("categories").toList().stream().map(o -> new ExtCategory(new JSONObject((Map)o))).collect(Collectors.toList()); + this.frameworks = object.getJSONArray("frameworks").toList().stream().map(o -> new ExtFramework(new JSONObject((Map)o))).collect(Collectors.toList()); + } + + public List getCategories() { + return categories; + } + + public List getFrameworks() { + return frameworks; + } +} diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreData.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreData.java index e79b213..8247253 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreData.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreData.java @@ -1,29 +1,32 @@ package gearth.services.internal_extensions.extensionstore.repository.models; +import org.json.JSONArray; +import org.json.JSONObject; + import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class StoreData { - private final List categories; - private final List frameworks; - + private final StoreConfig config; private final List extensions; - public StoreData(List categories, List frameworks, List extensions) { - this.categories = categories; - this.frameworks = frameworks; + public StoreData(StoreConfig config, List extensions) { + this.config = config; this.extensions = extensions; } - public List getCategories() { - return categories; - } - - public List getFrameworks() { - return frameworks; + public StoreData(JSONObject config, JSONArray extensions) { + this.config = new StoreConfig(config); + this.extensions = extensions.toList().stream().map(o -> new StoreExtension(new JSONObject((Map)o), this.config)).collect(Collectors.toList()); } public List getExtensions() { return extensions; } + + public StoreConfig getConfig() { + return config; + } } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreExtension.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreExtension.java index 6ddba8b..979e428 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreExtension.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/repository/models/StoreExtension.java @@ -1,7 +1,12 @@ package gearth.services.internal_extensions.extensionstore.repository.models; +import org.json.JSONObject; + import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class StoreExtension { @@ -24,6 +29,26 @@ public class StoreExtension { this.rating = rating; } + public StoreExtension(JSONObject object, StoreConfig storeConfig) { + this.title = object.getString("title"); + this.description = object.getString("title"); + this.authors = object.getJSONArray("authors").toList().stream().map(o -> new Author(new JSONObject((Map)o))).collect(Collectors.toList()); + this.version = object.getString("version"); + this.categories = storeConfig.getCategories().stream().filter(c -> object.getJSONArray("categories") + .toList().stream().anyMatch(j -> j.equals(c.getName()))).collect(Collectors.toList()); + this.source = object.getString("source"); + this.readme = object.has("readme") ? object.getString("readme") : null; + this.stable = object.getBoolean("stable"); + this.framework = new Framework(object.getJSONObject("framework"), storeConfig); + this.language = object.getString("language"); + this.commands = new Commands(object.getJSONObject("commands")); + this.compatibility = new Compatibility(object.getJSONObject("compatibility")); + this.submissionDate = LocalDateTime.parse(object.getString("submissionDate"), DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")); + this.updateDate = LocalDateTime.parse(object.getString("updateDate"), DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")); + this.isOutdated = object.getBoolean("isOutdated"); + this.rating = object.getInt("rating"); + } + public static class Author { private final String name; @@ -43,6 +68,15 @@ public class StoreExtension { this.reputation = reputation; } + public Author(JSONObject object) { + this.name = object.getString("name"); + this.discord = object.has("discord") ? object.getString("discord") : null; + this.hotel = object.has("hotel") ? object.getString("hotel") : null; + this.username = object.has("username") ? object.getString("username") : null; + this.extensionsCount = object.getInt("extensionsCount"); + this.reputation = object.getInt("reputation"); + } + public String getName() { return name; } @@ -78,6 +112,11 @@ public class StoreExtension { this.version = version; } + public Framework(JSONObject object, StoreConfig storeConfig) { + this.framework = storeConfig.getFrameworks().stream().filter(e -> e.getName().equals(object.getString("name"))).findFirst().get(); + this.version = object.getString("version"); + } + public ExtFramework getFramework() { return framework; } @@ -100,6 +139,13 @@ public class StoreExtension { this.mac = mac; } + public Commands(JSONObject object) { + this.defaultCommand = object.getString("default"); + this.linux = object.has("linux") ? object.getString("linux") : null; + this.windows = object.has("windows") ? object.getString("windows") : null; + this.mac = object.has("mac") ? object.getString("mac") : null; + } + public String getDefault() { return defaultCommand; } @@ -126,6 +172,11 @@ public class StoreExtension { this.clients = clients; } + public Compatibility(JSONObject object) { + this.systems = object.getJSONArray("systems").toList().stream().map(s -> (String)s).collect(Collectors.toList()); + this.clients = object.getJSONArray("clients").toList().stream().map(s -> (String)s).collect(Collectors.toList()); + } + public List getSystems() { return systems; } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java new file mode 100644 index 0000000..1e67427 --- /dev/null +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/StoreExtensionTools.java @@ -0,0 +1,108 @@ +package gearth.services.internal_extensions.extensionstore.tools; + +import gearth.services.extension_handler.extensions.implementations.network.executer.ExecutionInfo; +import gearth.services.extension_handler.extensions.implementations.network.executer.NormalExtensionRunner; +import gearth.services.internal_extensions.extensionstore.repository.StoreRepository; +import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension; +import org.apache.commons.io.FileUtils; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Paths; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class StoreExtensionTools { + + public interface InstallExtListener { + + void success(String installationFolder); + void fail(String reason); + + } + + + public static void executeExtension(String folderName) { + + } + + private static void unzipInto(InputStream inputStream, File directory) throws IOException { + inputStream = new BufferedInputStream(inputStream); + ZipInputStream zipInputStream = new ZipInputStream(inputStream); + + for (ZipEntry entry = null; (entry = zipInputStream.getNextEntry()) != null;) { + + File file = new File(Paths.get(directory.getPath(), entry.getName()).toString()); + + if (entry.isDirectory()) { + file.mkdirs(); + } + else { + FileUtils.copyInputStreamToFile(inputStream, file); +// StreamUtil.write(pathBuilder, inputStream, false); + } + + } + } + + public static void installExtension(String name, StoreRepository storeRepository, InstallExtListener listener) { + + + new Thread(() -> { + + String downloadUrl = String.format("https://github.com/sirjonasxx/G-ExtensionStore/raw/repo/%s/store/extensions/%s/extension.zip", storeRepository.getRepoVersion(), name); + Optional maybeExt = storeRepository.getExtensions().stream().filter(e -> e.getTitle().equals(name)).findFirst(); + if (maybeExt.isPresent()) { + StoreExtension ext = maybeExt.get(); + String version = ext.getVersion(); + + String folderName = name + "_" + version; + String path = Paths.get(NormalExtensionRunner.JARPATH, ExecutionInfo.EXTENSIONSDIRECTORY, folderName).toString(); + + File dir = new File(path); + File extensionPath = new File(Paths.get(path, "extension").toString()); + + if (extensionPath.mkdirs()) { + try { + URL url = new URL(downloadUrl); + InputStream inputStream = url.openStream(); + unzipInto(inputStream, extensionPath); + // todo command file + + + } catch (MalformedURLException e) { + listener.fail("Invalid extension URL"); + } catch (IOException e) { + listener.fail("Extension not available in repository"); + } + } + else { + listener.fail("Something went wrong creating the extension directory"); + } + } + else { + listener.fail("Extension wasn't found"); + } + + }).start(); + + } + + public static void removeExtension(String folderName) { + + } + + + public static void updateExtension() { + + } + + +}