Skip to content

Commit 8d4e096

Browse files
committed
Maven3 works, maven 4 needs more
1 parent e65d134 commit 8d4e096

22 files changed

+282
-41
lines changed

core/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,16 @@
4545
<artifactId>maven-resolver-util</artifactId>
4646
</dependency>
4747

48+
<!-- Maven -->
49+
<dependency>
50+
<groupId>org.apache.maven</groupId>
51+
<artifactId>maven-model</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.apache.maven</groupId>
55+
<artifactId>maven-resolver-provider</artifactId>
56+
</dependency>
57+
4858
<dependency>
4959
<groupId>org.junit.jupiter</groupId>
5060
<artifactId>junit-jupiter-api</artifactId>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package eu.maveniverse.maven.njord.shared.impl;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
import javax.inject.Inject;
6+
import javax.inject.Named;
7+
import javax.inject.Singleton;
8+
import org.apache.maven.model.Model;
9+
import org.apache.maven.repository.internal.ArtifactDescriptorReaderDelegate;
10+
import org.eclipse.aether.DefaultRepositorySystemSession;
11+
import org.eclipse.aether.RepositorySystem;
12+
import org.eclipse.aether.RepositorySystemSession;
13+
import org.eclipse.aether.artifact.Artifact;
14+
import org.eclipse.aether.repository.RemoteRepository;
15+
import org.eclipse.aether.resolution.ArtifactDescriptorException;
16+
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
17+
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
18+
19+
@Singleton
20+
@Named("maven3")
21+
public class Maven3ModelProvider implements ModelProvider {
22+
private final RepositorySystem repositorySystem;
23+
24+
@Inject
25+
public Maven3ModelProvider(RepositorySystem repositorySystem) {
26+
this.repositorySystem = repositorySystem;
27+
}
28+
29+
@Override
30+
public Optional<Model> readEffectiveModel(
31+
RepositorySystemSession session, Artifact artifact, List<RemoteRepository> remoteRepositories) {
32+
DefaultRepositorySystemSession ourSession = new DefaultRepositorySystemSession(session);
33+
ourSession.setConfigProperty(
34+
ArtifactDescriptorReaderDelegate.class.getName(), new ArtifactDescriptorReaderDelegate() {
35+
@Override
36+
public void populateResult(
37+
RepositorySystemSession session, ArtifactDescriptorResult result, Model model) {
38+
session.getData().set(Maven3ModelProvider.class, model);
39+
super.populateResult(session, result, model);
40+
}
41+
});
42+
43+
ArtifactDescriptorRequest adr = new ArtifactDescriptorRequest();
44+
adr.setArtifact(artifact);
45+
adr.setRepositories(remoteRepositories);
46+
adr.setRequestContext("njord");
47+
try {
48+
ArtifactDescriptorResult result =
49+
repositorySystem.readArtifactDescriptor(ourSession, adr); // ignore result; is in session.data
50+
return Optional.ofNullable((Model) ourSession.getData().get(Maven3ModelProvider.class));
51+
} catch (ArtifactDescriptorException e) {
52+
return Optional.empty();
53+
}
54+
}
55+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package eu.maveniverse.maven.njord.shared.impl;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
import org.apache.maven.model.Model;
6+
import org.eclipse.aether.RepositorySystemSession;
7+
import org.eclipse.aether.artifact.Artifact;
8+
import org.eclipse.aether.repository.RemoteRepository;
9+
10+
public interface ModelProvider {
11+
Optional<Model> readEffectiveModel(
12+
RepositorySystemSession session, Artifact artifact, List<RemoteRepository> remoteRepositories);
13+
}

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/DefaultArtifactStoreValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import eu.maveniverse.maven.njord.shared.publisher.ArtifactStoreValidator;
1414
import eu.maveniverse.maven.njord.shared.publisher.spi.BulkValidator;
1515
import eu.maveniverse.maven.njord.shared.publisher.spi.BulkValidatorFactory;
16-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
16+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1717
import eu.maveniverse.maven.njord.shared.publisher.spi.Validator;
1818
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidatorFactory;
1919
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
@@ -105,7 +105,7 @@ public ValidationResult validate(ArtifactStore artifactStore) throws IOException
105105
return vr;
106106
}
107107

108-
private static final class VR implements ValidationResult, ValidationResultCollector {
108+
private static final class VR implements ValidationResult, ValidationContext {
109109
private final String name;
110110
private final ArrayList<String> info = new ArrayList<>();
111111
private final ArrayList<String> warnings = new ArrayList<>();

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/ArchiveValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
package eu.maveniverse.maven.njord.shared.impl.publisher.basic;
99

1010
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
11-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
11+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1212
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1313
import java.io.IOException;
1414
import org.eclipse.aether.artifact.Artifact;
@@ -22,7 +22,7 @@ public ArchiveValidator(String name) {
2222
}
2323

2424
@Override
25-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
25+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
2626
throws IOException {
2727
if ("jar".equals(artifact.getExtension())) {
2828
collector.addInfo("TODO");

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/ArtifactChecksumValidator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import static java.util.Objects.requireNonNull;
1111

1212
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
13-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
13+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1414
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1515
import java.io.ByteArrayOutputStream;
1616
import java.io.IOException;
@@ -43,7 +43,7 @@ public ArtifactChecksumValidator(
4343
}
4444

4545
@Override
46-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
46+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
4747
throws IOException {
4848
List<ChecksumAlgorithmFactory> extraChecksums = artifactStore.checksumAlgorithmFactories().stream()
4949
.filter(a -> mandatoryChecksums.stream().anyMatch(c -> Objects.equals(a.getName(), c.getName())))
@@ -62,7 +62,7 @@ protected void validateArtifact(
6262
Artifact artifact,
6363
List<ChecksumAlgorithmFactory> algorithms,
6464
boolean mandatory,
65-
ValidationResultCollector chkCollector)
65+
ValidationContext chkCollector)
6666
throws IOException {
6767
Map<String, String> checksums = ChecksumAlgorithmHelper.calculate(artifact.getFile(), algorithms);
6868
HashSet<String> algOk = new HashSet<>();

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/JavadocJarValidatorFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
package eu.maveniverse.maven.njord.shared.impl.publisher.basic;
99

1010
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
11-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
11+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1212
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1313
import java.io.IOException;
1414
import org.eclipse.aether.artifact.Artifact;
@@ -27,7 +27,7 @@ public JavadocJarValidatorFactory(String name) {
2727
}
2828

2929
@Override
30-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
30+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
3131
throws IOException {
3232
if (artifact.getClassifier().isEmpty() && JAR.equals(artifact.getExtension())) {
3333
if (artifactStore.artifactPresent(new SubArtifact(artifact, JAVADOC, JAR))) {

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/PomCoordinatesValidatorFactory.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,60 @@
77
*/
88
package eu.maveniverse.maven.njord.shared.impl.publisher.basic;
99

10+
import static java.util.Objects.requireNonNull;
11+
12+
import eu.maveniverse.maven.njord.shared.impl.ModelProvider;
1013
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
11-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
14+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1215
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1316
import java.io.IOException;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.Objects;
20+
import java.util.Optional;
21+
import org.apache.maven.model.Model;
22+
import org.eclipse.aether.RepositorySystemSession;
1423
import org.eclipse.aether.artifact.Artifact;
24+
import org.eclipse.aether.repository.RemoteRepository;
1525

1626
/**
1727
* Verifies any found POM that its coordinates matches layout.
1828
*/
1929
public class PomCoordinatesValidatorFactory extends ValidatorSupport {
20-
public PomCoordinatesValidatorFactory(String name) {
30+
private final RepositorySystemSession session;
31+
private final List<RemoteRepository> remoteRepositories;
32+
private final ModelProvider modelProvider;
33+
34+
public PomCoordinatesValidatorFactory(
35+
String name,
36+
RepositorySystemSession session,
37+
List<RemoteRepository> repositories,
38+
ModelProvider modelProvider) {
2139
super(name);
40+
this.session = requireNonNull(session);
41+
this.remoteRepositories = requireNonNull(repositories);
42+
this.modelProvider = requireNonNull(modelProvider);
2243
}
2344

2445
@Override
25-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
46+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
2647
throws IOException {
2748
if (artifact.getClassifier().isEmpty() && "pom".equals(artifact.getExtension())) {
28-
collector.addInfo("TODO");
49+
ArrayList<RemoteRepository> remoteRepositories = new ArrayList<>(this.remoteRepositories);
50+
remoteRepositories.add(artifactStore.storeRemoteRepository());
51+
Optional<Model> mo = modelProvider.readEffectiveModel(session, artifact, remoteRepositories);
52+
if (mo.isPresent()) {
53+
Model m = mo.orElseThrow();
54+
if (Objects.equals(artifact.getGroupId(), m.getGroupId())
55+
&& Objects.equals(artifact.getArtifactId(), m.getArtifactId())
56+
&& Objects.equals(artifact.getBaseVersion(), m.getVersion())) {
57+
collector.addInfo("VALID");
58+
} else {
59+
collector.addError("MISMATCH");
60+
}
61+
} else {
62+
collector.addError("Could not get effective model");
63+
}
2964
}
3065
}
3166
}

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/PomProjectValidatorFactory.java

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,116 @@
77
*/
88
package eu.maveniverse.maven.njord.shared.impl.publisher.basic;
99

10+
import static java.util.Objects.requireNonNull;
11+
12+
import eu.maveniverse.maven.njord.shared.impl.ModelProvider;
1013
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
11-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
14+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1215
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1316
import java.io.IOException;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.Optional;
20+
import org.apache.maven.model.Developer;
21+
import org.apache.maven.model.License;
22+
import org.apache.maven.model.Model;
23+
import org.apache.maven.model.Scm;
24+
import org.eclipse.aether.RepositorySystemSession;
1425
import org.eclipse.aether.artifact.Artifact;
26+
import org.eclipse.aether.repository.RemoteRepository;
1527

1628
/**
1729
* Verifies that any found POM name, description, project URL, SCM and license is filled in.
1830
*/
1931
public class PomProjectValidatorFactory extends ValidatorSupport {
20-
public PomProjectValidatorFactory(String name) {
32+
private final RepositorySystemSession session;
33+
private final List<RemoteRepository> remoteRepositories;
34+
private final ModelProvider modelProvider;
35+
36+
public PomProjectValidatorFactory(
37+
String name,
38+
RepositorySystemSession session,
39+
List<RemoteRepository> repositories,
40+
ModelProvider modelProvider) {
2141
super(name);
42+
this.session = requireNonNull(session);
43+
this.remoteRepositories = requireNonNull(repositories);
44+
this.modelProvider = requireNonNull(modelProvider);
2245
}
2346

2447
@Override
25-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
48+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
2649
throws IOException {
2750
if (artifact.getClassifier().isEmpty() && "pom".equals(artifact.getExtension())) {
28-
collector.addInfo("TODO");
51+
ArrayList<RemoteRepository> remoteRepositories = new ArrayList<>(this.remoteRepositories);
52+
remoteRepositories.add(artifactStore.storeRemoteRepository());
53+
Optional<Model> mo = modelProvider.readEffectiveModel(session, artifact, remoteRepositories);
54+
if (mo.isPresent()) {
55+
Model m = mo.orElseThrow();
56+
if (m.getName() != null && !m.getName().trim().isEmpty()) {
57+
collector.addInfo("POM project/name OK");
58+
} else {
59+
collector.addError("POM project/name MISSING");
60+
}
61+
if (m.getDescription() != null && !m.getDescription().trim().isEmpty()) {
62+
collector.addInfo("POM project/description OK");
63+
} else {
64+
collector.addError("POM project/description MISSING");
65+
}
66+
if (m.getUrl() != null && !m.getUrl().trim().isEmpty()) {
67+
collector.addInfo("POM project/url OK");
68+
} else {
69+
collector.addError("POM project/url MISSING");
70+
}
71+
if (m.getLicenses().isEmpty()) {
72+
collector.addError("POM project/licenses MISSING");
73+
} else {
74+
boolean ok = true;
75+
for (License license : m.getLicenses()) {
76+
if ((license.getName() == null
77+
|| license.getName().trim().isEmpty())
78+
|| (license.getUrl() == null
79+
|| license.getUrl().trim().isEmpty())) {
80+
ok = false;
81+
collector.addError("POM project/licenses/license MISSING (incomplete)");
82+
}
83+
}
84+
if (ok) {
85+
collector.addInfo("POM project/licenses OK");
86+
}
87+
}
88+
if (m.getDevelopers().isEmpty()) {
89+
collector.addError("POM project/developers MISSING");
90+
} else {
91+
boolean ok = true;
92+
for (Developer developer : m.getDevelopers()) {
93+
if ((developer.getName() == null
94+
|| developer.getName().trim().isEmpty())
95+
|| (developer.getEmail() == null
96+
|| developer.getEmail().trim().isEmpty())) {
97+
ok = false;
98+
collector.addError("POM project/developers/developer MISSING (incomplete)");
99+
}
100+
}
101+
if (ok) {
102+
collector.addInfo("POM project/licenses OK");
103+
}
104+
}
105+
if (m.getScm() == null) {
106+
collector.addError("POM project/scm MISSING");
107+
} else {
108+
Scm scm = m.getScm();
109+
if ((scm.getUrl() == null || scm.getUrl().trim().isEmpty())
110+
|| (scm.getConnection() == null
111+
|| scm.getConnection().trim().isEmpty())
112+
|| (scm.getDeveloperConnection() == null
113+
|| scm.getDeveloperConnection().trim().isEmpty())) {
114+
collector.addError("POM project/scm MISSING (incomplete)");
115+
}
116+
}
117+
} else {
118+
collector.addError("Could not get effective model");
119+
}
29120
}
30121
}
31122
}

core/src/main/java/eu/maveniverse/maven/njord/shared/impl/publisher/basic/SourceJarValidatorFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
package eu.maveniverse.maven.njord.shared.impl.publisher.basic;
99

1010
import eu.maveniverse.maven.njord.shared.impl.publisher.ValidatorSupport;
11-
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationResultCollector;
11+
import eu.maveniverse.maven.njord.shared.publisher.spi.ValidationContext;
1212
import eu.maveniverse.maven.njord.shared.store.ArtifactStore;
1313
import java.io.IOException;
1414
import org.eclipse.aether.artifact.Artifact;
@@ -26,7 +26,7 @@ public SourceJarValidatorFactory(String name) {
2626
}
2727

2828
@Override
29-
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationResultCollector collector)
29+
public void validate(ArtifactStore artifactStore, Artifact artifact, ValidationContext collector)
3030
throws IOException {
3131
if (artifact.getClassifier().isEmpty() && JAR.equals(artifact.getExtension())) {
3232
if (artifactStore.artifactPresent(new SubArtifact(artifact, SOURCES, JAR))) {

0 commit comments

Comments
 (0)