diff --git a/pom.xml b/pom.xml index 7e5ac0a..6647f5e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.extio game-engine - 1.0.25 + 1.0.26 25 diff --git a/src/main/java/de/extio/game_engine/resource/StaticResourceServiceImpl.java b/src/main/java/de/extio/game_engine/resource/StaticResourceServiceImpl.java index d2470ad..3eade9a 100644 --- a/src/main/java/de/extio/game_engine/resource/StaticResourceServiceImpl.java +++ b/src/main/java/de/extio/game_engine/resource/StaticResourceServiceImpl.java @@ -2,7 +2,6 @@ package de.extio.game_engine.resource; import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -14,7 +13,7 @@ import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.extio.game_engine.storage.StorageServiceImpl; +import de.extio.game_engine.util.CodeSourceLocationResolver; import de.extio.game_engine.util.ObjectSerialization; public class StaticResourceServiceImpl implements StaticResourceService { @@ -27,23 +26,13 @@ public class StaticResourceServiceImpl implements StaticResourceService { String location = System.getProperty("datalocation"); if (location == null) { try { - final URL url = StorageServiceImpl.class.getProtectionDomain().getCodeSource().getLocation(); + final var url = StaticResourceServiceImpl.class.getProtectionDomain().getCodeSource().getLocation(); LOGGER.info("Code source location: {}", url); - Path parent; - if (url.toString().startsWith("jar:nested:")) { - if (Objects.requireNonNullElse(System.getProperty("os.name"), "").toLowerCase().contains("windows")) { - parent = Paths.get(url.toString().substring("jar:nested:/".length(), url.toString().indexOf("/!"))).getParent(); - } - else { - parent = Paths.get(url.toString().substring("jar:nested:".length(), url.toString().indexOf("/!"))).getParent(); - } - } - else { - parent = Paths.get(url.toURI()).getParent(); - } - final Path jarPath = parent != null ? parent.toAbsolutePath().normalize() : Paths.get(url.toURI()).toAbsolutePath().normalize(); + final var codeSourcePath = CodeSourceLocationResolver.resolvePath(StaticResourceServiceImpl.class); + final var parent = codeSourcePath.getParent(); + final Path jarPath = parent != null ? parent.toAbsolutePath().normalize() : codeSourcePath; - final String currentSubDir = jarPath.getFileName().toString(); + final String currentSubDir = jarPath.getFileName() != null ? jarPath.getFileName().toString() : ""; if ("bin".equals(currentSubDir) || "target".equals(currentSubDir)) { location = jarPath.getParent().resolve("data").toString(); } diff --git a/src/main/java/de/extio/game_engine/storage/StorageServiceImpl.java b/src/main/java/de/extio/game_engine/storage/StorageServiceImpl.java index 5b87298..7e15d6a 100644 --- a/src/main/java/de/extio/game_engine/storage/StorageServiceImpl.java +++ b/src/main/java/de/extio/game_engine/storage/StorageServiceImpl.java @@ -3,7 +3,6 @@ package de.extio.game_engine.storage; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -16,6 +15,7 @@ import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.extio.game_engine.util.CodeSourceLocationResolver; import de.extio.game_engine.util.ObjectSerialization; import de.extio.game_engine.util.rng.FastRandomUUID; @@ -37,22 +37,11 @@ public class StorageServiceImpl implements StorageService { String location = System.getProperty("storagelocation"); if (location == null) { try { - final URL url = StorageServiceImpl.class.getProtectionDomain().getCodeSource().getLocation(); - Path parent; - if (url.toString().startsWith("jar:nested:")) { - if (Objects.requireNonNullElse(System.getProperty("os.name"), "").toLowerCase().contains("windows")) { - parent = Paths.get(url.toString().substring("jar:nested:/".length(), url.toString().indexOf("/!"))).getParent(); - } - else { - parent = Paths.get(url.toString().substring("jar:nested:".length(), url.toString().indexOf("/!"))).getParent(); - } - } - else { - parent = Paths.get(url.toURI()).getParent(); - } - final Path jarPath = parent != null ? parent.toAbsolutePath().normalize() : Paths.get(url.toURI()).toAbsolutePath().normalize(); + final var codeSourcePath = CodeSourceLocationResolver.resolvePath(StorageServiceImpl.class); + final var parent = codeSourcePath.getParent(); + final Path jarPath = parent != null ? parent.toAbsolutePath().normalize() : codeSourcePath; - final String currentSubDir = jarPath.getFileName().toString(); + final String currentSubDir = jarPath.getFileName() != null ? jarPath.getFileName().toString() : ""; if ("bin".equals(currentSubDir) || "target".equals(currentSubDir)) { location = jarPath.getParent().resolve("storage").toString(); } diff --git a/src/main/java/de/extio/game_engine/util/CodeSourceLocationResolver.java b/src/main/java/de/extio/game_engine/util/CodeSourceLocationResolver.java new file mode 100644 index 0000000..9fc96a1 --- /dev/null +++ b/src/main/java/de/extio/game_engine/util/CodeSourceLocationResolver.java @@ -0,0 +1,44 @@ +package de.extio.game_engine.util; + +import java.net.URI; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; + +public final class CodeSourceLocationResolver { + + private CodeSourceLocationResolver() { + } + + public static Path resolvePath(final Class clazz) throws Exception { + final var codeSource = clazz.getProtectionDomain().getCodeSource(); + if (codeSource == null) { + throw new IllegalStateException("Could not determine code source for " + clazz.getName()); + } + return resolvePath(codeSource.getLocation()); + } + + public static Path resolvePath(final URL url) throws Exception { + var location = url.toExternalForm(); + if (location.startsWith("jar:nested:")) { + location = location.substring("jar:nested:".length()); + final var nestedSeparator = location.indexOf("/!"); + if (nestedSeparator >= 0) { + location = location.substring(0, nestedSeparator); + } + return decodePath(location).toAbsolutePath().normalize(); + } + return Paths.get(url.toURI()).toAbsolutePath().normalize(); + } + + private static Path decodePath(final String location) { + if (location.startsWith("file:")) { + return Paths.get(URI.create(location)); + } + if (location.matches("^[A-Za-z]:/.*")) { + return Paths.get(URI.create("file:/" + location)); + } + return Paths.get(URI.create("file:" + location)); + } + +} \ No newline at end of file