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