From 344bdea382c68f76d15d924ac347c61eaf2bfe05 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 20 Aug 2021 02:35:42 +0200 Subject: [PATCH] allow spaces in extension names --- .../entities/StoreExtensionItem.java | 2 +- .../entities/categories/CategoryItem.java | 2 +- .../StoreExtensionDetailsItem.java | 6 +- .../StoreExtensionDetailsOverview.java | 2 +- .../queriedoverviews/CategorizedOverview.java | 2 +- .../repository/StoreRepository.java | 8 +- .../extensionstore/tools/EncodingUtil.java | 85 +++++++++++++++++++ 7 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/EncodingUtil.java diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java index 9059083..aa976ed 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/StoreExtensionItem.java @@ -51,7 +51,7 @@ public class StoreExtensionItem implements ContentItem { .append("
") .append("
") - .append("\"\"") + .append("\"\"") .append("
") .append("
") diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java index 1c672c0..d998c3f 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/categories/CategoryItem.java @@ -49,7 +49,7 @@ public class CategoryItem implements ContentItem { .append("
") .append("
") - .append("\"\"") + .append("\"\"") .append("
") .append("
") diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java index 416f7cf..9364bd7 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsItem.java @@ -7,12 +7,14 @@ import gearth.services.internal_extensions.extensionstore.application.entities.C import gearth.services.internal_extensions.extensionstore.application.entities.HOverview; import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory; import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension; +import gearth.services.internal_extensions.extensionstore.tools.EncodingUtil; import netscape.javascript.JSObject; import org.apache.commons.io.IOUtils; import org.json.JSONObject; import java.io.IOException; import java.net.URL; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -48,7 +50,7 @@ public class StoreExtensionDetailsItem implements ContentItem { try { JSONObject habboData = new JSONObject(IOUtils.toString( new URL(HABBO_API_URL.replace("{hotel}", mainAuthor.getHotel()).replace("{user}", - mainAuthor.getUsername())).openStream(), StandardCharsets.UTF_8)); + EncodingUtil.encodeURIComponent(mainAuthor.getUsername()))).openStream(), StandardCharsets.UTF_8)); if (habboData.has("figureString")) { avatarImageUrl = OUTFIT_URL.replace("{figureString}", habboData.getString("figureString")); @@ -101,7 +103,7 @@ public class StoreExtensionDetailsItem implements ContentItem { } contentBuilder.append("\n*Screenshot: *").append("\n") - .append("--img:").append(gExtensionStore.getRepository().getResourceUrl(String.format("store/extensions/%s/screenshot.png", storeExtension.getTitle()))); + .append("--img:").append(gExtensionStore.getRepository().getResourceUrl("store", "extensions", storeExtension.getTitle(), "screenshot.png")); return contentBuilder.toString(); } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java index 1aeeeea..ebc04b8 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/extensiondetails/StoreExtensionDetailsOverview.java @@ -159,7 +159,7 @@ public class StoreExtensionDetailsOverview extends HOverview { return new Header() { @Override public String iconUrl() { - return storeRepository.getResourceUrl(String.format("store/extensions/%s/icon.png", extension.getTitle())); + return storeRepository.getResourceUrl("store", "extensions", extension.getTitle(), "icon.png"); } @Override diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java index c0f7304..e530256 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/application/entities/queriedoverviews/CategorizedOverview.java @@ -32,7 +32,7 @@ public class CategorizedOverview extends QueriedExtensionOverview { return new Header() { @Override public String iconUrl() { - return storeRepository.getResourceUrl(String.format("assets/icons/%s", category.getIcon())); + return storeRepository.getResourceUrl("assets", "icons", category.getIcon()); } @Override 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 6c8bb50..b3f21f3 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 @@ -2,7 +2,10 @@ package gearth.services.internal_extensions.extensionstore.repository; import gearth.services.internal_extensions.extensionstore.repository.models.*; import gearth.services.internal_extensions.extensionstore.repository.querying.ExtensionOrdering; +import gearth.services.internal_extensions.extensionstore.tools.EncodingUtil; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -112,8 +115,9 @@ public class StoreRepository { return repoVersion; } - public String getResourceUrl(String resource) { - return String.format("https://raw.githubusercontent.com/%s/repo/%s/%s", source, repoVersion, resource); + public String getResourceUrl(String... resource) { + return String.format("https://raw.githubusercontent.com/%s/repo/%s/%s", source, repoVersion, + Arrays.stream(resource).map(EncodingUtil::encodeURIComponent).collect(Collectors.joining("/"))); } } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/EncodingUtil.java b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/EncodingUtil.java new file mode 100644 index 0000000..4aeaa96 --- /dev/null +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/extensionstore/tools/EncodingUtil.java @@ -0,0 +1,85 @@ +package gearth.services.internal_extensions.extensionstore.tools; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; + +/** + * Utility class for JavaScript compatible UTF-8 encoding and decoding. + * + * @see http://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-output + * @author John Topley + */ +public class EncodingUtil +{ + /** + * Decodes the passed UTF-8 String using an algorithm that's compatible with + * JavaScript's decodeURIComponent function. Returns + * null if the String is null. + * + * @param s The UTF-8 encoded String to be decoded + * @return the decoded String + */ + public static String decodeURIComponent(String s) + { + if (s == null) + { + return null; + } + + String result = null; + + try + { + result = URLDecoder.decode(s, "UTF-8"); + } + + // This exception should never occur. + catch (UnsupportedEncodingException e) + { + result = s; + } + + return result; + } + + /** + * Encodes the passed String as UTF-8 using an algorithm that's compatible + * with JavaScript's encodeURIComponent function. Returns + * null if the String is null. + * + * @param s The String to be encoded + * @return the encoded String + */ + public static String encodeURIComponent(String s) + { + String result = null; + + try + { + result = URLEncoder.encode(s, "UTF-8") + .replaceAll("\\+", "%20") + .replaceAll("%21", "!") + .replaceAll("%27", "'") + .replaceAll("%28", "(") + .replaceAll("%29", ")") + .replaceAll("%7E", "~"); + } + + // This exception should never occur. + catch (UnsupportedEncodingException e) + { + result = s; + } + + return result; + } + + /** + * Private constructor to prevent this class from being instantiated. + */ + private EncodingUtil() + { + super(); + } +} \ No newline at end of file