diff --git a/src/main/java/dev/kruhlmann/imgfloat/service/VersionService.java b/src/main/java/dev/kruhlmann/imgfloat/service/VersionService.java index dd47c80..2da4f7c 100644 --- a/src/main/java/dev/kruhlmann/imgfloat/service/VersionService.java +++ b/src/main/java/dev/kruhlmann/imgfloat/service/VersionService.java @@ -5,6 +5,10 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; @Component public class VersionService { @@ -31,6 +35,11 @@ public class VersionService { return pomVersion; } + String pomXmlVersion = getPomXmlVersion(); + if (pomXmlVersion != null && !pomXmlVersion.isBlank()) { + return pomXmlVersion; + } + return "unknown"; } @@ -64,4 +73,60 @@ public class VersionService { } return null; } + + private String getPomXmlVersion() { + // Attempt to load pom.xml from the classpath (available when running from sources) + InputStream classpathPom = getClass().getClassLoader().getResourceAsStream("pom.xml"); + if (classpathPom != null) { + try { + String version = extractVersionFromPom(classpathPom); + if (version != null) { + return version; + } + } finally { + try { + classpathPom.close(); + } catch (IOException e) { + LOG.warn("Unable to close pom.xml stream from classpath", e); + } + } + } + + // Fallback to reading pom.xml from the filesystem root (common during development) + Path pomPath = Paths.get("pom.xml"); + if (Files.exists(pomPath) && Files.isRegularFile(pomPath)) { + try (InputStream filePom = Files.newInputStream(pomPath)) { + return extractVersionFromPom(filePom); + } catch (IOException e) { + LOG.warn("Unable to read pom.xml from filesystem", e); + } + } + + return null; + } + + private String extractVersionFromPom(InputStream pomInputStream) { + if (pomInputStream == null) { + return null; + } + try { + var documentBuilderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + + var documentBuilder = documentBuilderFactory.newDocumentBuilder(); + var document = documentBuilder.parse(pomInputStream); + var versionNodes = document.getElementsByTagName("version"); + if (versionNodes.getLength() > 0) { + var version = versionNodes.item(0).getTextContent(); + if (version != null && !version.isBlank()) { + return version.trim(); + } + } + } catch (Exception e) { + LOG.warn("Unable to parse version from pom.xml", e); + } + return null; + } }