🚧 Add snapshot parser + fix tests

This commit is contained in:
Andreas Dinauer 2026-04-18 14:34:49 +02:00
parent aec2a3b194
commit 15b9be7cc8
11 changed files with 299 additions and 37 deletions

View File

@ -1,7 +1,9 @@
package dev.dinauer.maven.maven.core; package dev.dinauer.maven.maven.core;
import dev.dinauer.maven.maven.core.model.File; import dev.dinauer.maven.maven.core.model.*;
import dev.dinauer.maven.maven.core.model.MavenContext; import dev.dinauer.maven.maven.core.parser.MavenMetadataUrlParser;
import dev.dinauer.maven.maven.core.parser.MavenUrlParser;
import org.apache.commons.io.FilenameUtils;
import java.nio.file.Path; import java.nio.file.Path;
@ -9,20 +11,27 @@ public class MavenContextProvider
{ {
public static MavenContext parse(String path) public static MavenContext parse(String path)
{ {
File file = File.parse(Path.of(path).getFileName().toString()); switch (getExtension(path))
switch (file.getType())
{ {
case JAR, POM -> case JAR, POM ->
{ {
MavenUrlParser parser = MavenUrlParser.parse(path); MavenUrlParser parser = MavenUrlParser.parse(path);
return new MavenContext(path, parser.groupId(), parser.artifactId(), parser.version(), file); String artifact = parser.artifactId();
Version version = parser.version();
return new MavenContext(path, parser.groupId(), artifact, version, FileParser.parse(artifact, version.getRaw(), Path.of(path).getFileName().toString()));
} }
case XML -> case XML ->
{ {
MavenMetadataUrlParser parser = MavenMetadataUrlParser.parse(path); MavenMetadataUrlParser parser = MavenMetadataUrlParser.parse(path);
return new MavenContext(path, parser.groupId(), parser.artifactId(), null, file); String artifact = parser.artifactId();
return new MavenContext(path, parser.groupId(), parser.artifactId(), null, null);
} }
} }
throw new RuntimeException(); throw new RuntimeException();
} }
private static FileType getExtension(String filename)
{
return ExtensionParser.parse(filename).ext();
}
} }

View File

@ -0,0 +1,36 @@
package dev.dinauer.maven.maven.core.model;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.Strings;
import java.util.List;
public class ExtensionParser
{
private static final List<String> FILE_TYPES = List.of("jar", "pom", "xml");
private static final List<String> FILE_HASHES = List.of("md5", "sha1", "sha256", "sha512");
public static Result parse(String raw)
{
String firstLevelExtension = FilenameUtils.getExtension(raw);
String firstLevelBase = Strings.CI.removeEnd(raw, String.format(".%s", firstLevelExtension));
if (FILE_TYPES.contains(firstLevelExtension))
{
return new Result(firstLevelBase, FileType.valueOf(firstLevelExtension.toUpperCase()), null);
}
if (FILE_HASHES.contains(firstLevelExtension))
{
String secondLevelExtension = FilenameUtils.getExtension(firstLevelBase);
if (FILE_TYPES.contains(secondLevelExtension))
{
String secondLevelBase = Strings.CI.removeEnd(firstLevelBase, String.format(".%s", secondLevelExtension));
return new Result(secondLevelBase, FileType.valueOf(secondLevelExtension.toUpperCase()), FileHash.valueOf(firstLevelExtension.toUpperCase()));
}
}
throw new RuntimeException();
}
public record Result(String base, FileType ext, FileHash hashExt)
{
}
}

View File

@ -7,10 +7,8 @@ import java.util.List;
public class File public class File
{ {
private static final String METADATA_FILENAME = "maven-metadata"; private String artifactId;
private static final List<String> FILE_TYPES = List.of("jar", "pom", "xml"); private String version;
private static final List<String> FILE_HASHES = List.of("md5", "sha1");
private String raw; private String raw;
private String base; private String base;
private FileType type; private FileType type;
@ -60,30 +58,25 @@ public class File
return this; return this;
} }
public static File parse(String raw) public String getArtifactId()
{ {
File file = new File().setRaw(raw); return artifactId;
String extension = FilenameUtils.getExtension(raw); }
String base = FilenameUtils.getBaseName(raw);
if (FILE_TYPES.contains(extension.toLowerCase())) public File setArtifactId(String artifactId)
{ {
file.setType(FileType.valueOf(extension.toUpperCase())); this.artifactId = artifactId;
file.setBase(base); return this;
file.setHash(FileHash.NONE); }
return file;
} public String getVersion()
if (FILE_HASHES.contains(extension)) {
{ return version;
file.setHash(FileHash.valueOf(extension.toUpperCase())); }
String secondaryExtension = FilenameUtils.getExtension(base);
String secondaryBase = FilenameUtils.getBaseName(base); public File setVersion(String version)
if (FILE_TYPES.contains(secondaryExtension.toLowerCase())) {
{ this.version = version;
file.setType(FileType.valueOf(secondaryExtension.toUpperCase())); return this;
file.setBase(secondaryBase);
return file;
}
}
throw new BadRequestException();
} }
} }

View File

@ -2,5 +2,5 @@ package dev.dinauer.maven.maven.core.model;
public enum FileHash public enum FileHash
{ {
SHA1, MD5, NONE SHA1, SHA256, SHA512, MD5, NONE
} }

View File

@ -0,0 +1,39 @@
package dev.dinauer.maven.maven.core.model;
import jakarta.ws.rs.BadRequestException;
import org.apache.commons.io.FilenameUtils;
import java.util.List;
public class FileParser
{
private static final List<String> FILE_TYPES = List.of("jar", "pom", "xml");
private static final List<String> FILE_HASHES = List.of("md5", "sha1");
public static File parse(String artifactId, String version, String raw)
{
File file = new File().setRaw(raw);
String extension = FilenameUtils.getExtension(raw);
String base = FilenameUtils.getBaseName(raw);
if (FILE_TYPES.contains(extension.toLowerCase()))
{
file.setType(FileType.valueOf(extension.toUpperCase()));
file.setBase(base);
file.setHash(FileHash.NONE);
return file;
}
if (FILE_HASHES.contains(extension))
{
file.setHash(FileHash.valueOf(extension.toUpperCase()));
String secondaryExtension = FilenameUtils.getExtension(base);
String secondaryBase = FilenameUtils.getBaseName(base);
if (FILE_TYPES.contains(secondaryExtension.toLowerCase()))
{
file.setType(FileType.valueOf(secondaryExtension.toUpperCase()));
file.setBase(secondaryBase);
return file;
}
}
throw new BadRequestException();
}
}

View File

@ -0,0 +1,41 @@
package dev.dinauer.maven.maven.core.model;
public class SnapshotFile extends File
{
private int buildNumber;
private String date;
private String time;
public int getBuildNumber()
{
return buildNumber;
}
public SnapshotFile setBuildNumber(int buildNumber)
{
this.buildNumber = buildNumber;
return this;
}
public String getDate()
{
return date;
}
public SnapshotFile setDate(String date)
{
this.date = date;
return this;
}
public String getTime()
{
return time;
}
public SnapshotFile setTime(String time)
{
this.time = time;
return this;
}
}

View File

@ -0,0 +1,80 @@
package dev.dinauer.maven.maven.core.model;
import jakarta.ws.rs.BadRequestException;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.Strings;
import java.util.List;
import java.util.OptionalInt;
import java.util.stream.IntStream;
public class SnapshotFileParser
{
public static SnapshotFile parse(String artifactId, String version, String raw)
{
ExtensionParser.Result extensionResult = ExtensionParser.parse(raw);
SnapshotFile file = new SnapshotFile();
file.setBase(extensionResult.base());
file.setType(extensionResult.ext());
file.setHash(extensionResult.hashExt());
file.setRaw(raw);
file.setArtifactId(artifactId);
file.setVersion(version);
String dataString = prepareForData(artifactId, version, raw);
file.setDate(getDate(dataString));
String timeString = prepareForTime(dataString);
file.setTime(getTime(timeString));
String buildNumberString = prepareForBuildNumber(timeString);
file.setBuildNumber(getBuildNumber(buildNumberString));
return file;
}
private static String prepareForData(String artifact, String version, String raw)
{
return Strings.CI.removeStart(raw, String.format("%s-%s-", artifact, prepareVersion(version)));
}
private static String prepareForTime(String path)
{
return Strings.CI.removeStart(path.substring(9), ".");
}
private static String prepareForBuildNumber(String path)
{
return Strings.CI.removeStart(path.substring(7), "-");
}
private static int getBuildNumber(String path)
{
int nextDot = path.indexOf(".");
int nextDash = path.indexOf("-");
OptionalInt optInt = IntStream.of(nextDash, nextDot).filter(index -> index > 0).min();
if (optInt.isPresent())
{
return Integer.parseInt(path.substring(0, optInt.getAsInt()));
}
throw new IllegalArgumentException();
}
private static String getDate(String path)
{
return path.substring(0, 8);
}
private static String getTime(String path)
{
return path.substring(0, 6);
}
private static String prepareVersion(String version)
{
return Strings.CI.removeEnd(version, "-SNAPSHOT");
}
}

View File

@ -1,4 +1,4 @@
package dev.dinauer.maven.maven.core; package dev.dinauer.maven.maven.core.parser;
import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.BadRequestException;

View File

@ -1,4 +1,4 @@
package dev.dinauer.maven.maven.core; package dev.dinauer.maven.maven.core.parser;
import dev.dinauer.maven.maven.core.model.Version; import dev.dinauer.maven.maven.core.model.Version;
import jakarta.ws.rs.BadRequestException; import jakarta.ws.rs.BadRequestException;

View File

@ -0,0 +1,43 @@
package dev.dinauer.maven.maven.core.model;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class ExtensionParserTest
{
@Test
void test_01()
{
String filename = "test.jar.md5";
ExtensionParser.Result result = ExtensionParser.parse(filename);
Assertions.assertEquals("test", result.base());
Assertions.assertEquals(FileType.JAR, result.ext());
Assertions.assertEquals(FileHash.MD5, result.hashExt());
}
@Test
void test_02()
{
String filename = "test.pom.sha1";
ExtensionParser.Result result = ExtensionParser.parse(filename);
Assertions.assertEquals("test", result.base());
Assertions.assertEquals(FileType.POM, result.ext());
Assertions.assertEquals(FileHash.SHA1, result.hashExt());
}
@Test
void test_03()
{
String filename = "test.jar";
ExtensionParser.Result result = ExtensionParser.parse(filename);
Assertions.assertEquals("test", result.base());
Assertions.assertEquals(FileType.JAR, result.ext());
Assertions.assertNull(result.hashExt());
}
}

View File

@ -0,0 +1,21 @@
package dev.dinauer.maven.maven.core.model;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class SnapshotFileParserTest
{
@Test
void test()
{
String filename = "my-library-1.0.0-20240315.142307-3-tests.jar.md5";
SnapshotFile file = SnapshotFileParser.parse("my-library", "1.0.0-SNAPSHOT", filename);
Assertions.assertEquals("20240315", file.getDate());
Assertions.assertEquals("142307", file.getTime());
Assertions.assertEquals(3, file.getBuildNumber());
Assertions.assertEquals(FileType.JAR, file.getType());
Assertions.assertEquals(FileHash.MD5, file.getHash());
}
}