Skip to content

Commit d99e88f

Browse files
authored
Fix validation issues (#124)
Cumulative fixes for validation. Changes: * rename classes (they were long time ago Factories, they are not today) * for main JAR artifacts: do not rely in their presence only, add "contains Java classes" detection as well * use detection in sources and javadoc validator * model provider is totally busted, we need MIMA MMR here instead. MMR is able to build effective model and does NOT follow relocation. It does exactly what we need. Fixes #121 Fixes #122 Fixes #123
1 parent 732d899 commit d99e88f

26 files changed

+865
-181
lines changed

core/pom.xml

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@
7777
<scope>provided</scope>
7878
</dependency>
7979

80+
<dependency>
81+
<groupId>eu.maveniverse.maven.mima.extensions</groupId>
82+
<artifactId>mmr</artifactId>
83+
<exclusions>
84+
<exclusion>
85+
<groupId>*</groupId>
86+
<artifactId>*</artifactId>
87+
</exclusion>
88+
</exclusions>
89+
</dependency>
90+
8091
<dependency>
8192
<groupId>org.junit.jupiter</groupId>
8293
<artifactId>junit-jupiter-api</artifactId>
@@ -92,9 +103,21 @@
92103
<artifactId>jcl-over-slf4j</artifactId>
93104
<scope>test</scope>
94105
</dependency>
106+
95107
<dependency>
96-
<groupId>org.apache.maven.resolver</groupId>
97-
<artifactId>maven-resolver-impl</artifactId>
108+
<groupId>eu.maveniverse.maven.mima</groupId>
109+
<artifactId>context</artifactId>
110+
<scope>test</scope>
111+
</dependency>
112+
<dependency>
113+
<groupId>eu.maveniverse.maven.mima.runtime</groupId>
114+
<artifactId>standalone-sisu</artifactId>
115+
<scope>test</scope>
116+
</dependency>
117+
<dependency>
118+
<groupId>com.google.inject</groupId>
119+
<artifactId>guice</artifactId>
120+
<classifier>classes</classifier>
98121
<scope>test</scope>
99122
</dependency>
100123
</dependencies>

core/src/main/java/eu/maveniverse/maven/njord/shared/Session.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
import java.io.Closeable;
2121
import java.io.IOException;
2222
import java.util.Collection;
23+
import java.util.List;
2324
import java.util.Optional;
25+
import org.apache.maven.model.Model;
26+
import org.eclipse.aether.artifact.Artifact;
27+
import org.eclipse.aether.repository.RemoteRepository;
2428

2529
public interface Session extends Closeable {
2630
/**
@@ -76,6 +80,13 @@ default Optional<ArtifactStoreComparator> selectArtifactStoreComparator(String n
7680
.findFirst();
7781
}
7882

83+
/**
84+
* Reads the effective model of given artifact. The artifact does not have to be POM artifact. The repositories
85+
* must be given, and caller must ensure that provided list of repositories makes artifact model buildable,
86+
* like parents are resolvable.
87+
*/
88+
Optional<Model> readEffectiveModel(Artifact artifact, List<RemoteRepository> remoteRepositories);
89+
7990
/**
8091
* Selects template based on provided URL (see {@link #getOrCreateSessionArtifactStore(String)} method for syntax).
8192
* For existing stores it will return the template of the store.

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

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
import static java.util.Objects.requireNonNull;
1111

12+
import eu.maveniverse.maven.mima.extensions.mmr.ModelRequest;
13+
import eu.maveniverse.maven.mima.extensions.mmr.ModelResponse;
14+
import eu.maveniverse.maven.mima.extensions.mmr.internal.MavenModelReaderImpl;
1215
import eu.maveniverse.maven.njord.shared.Session;
1316
import eu.maveniverse.maven.njord.shared.SessionConfig;
1417
import eu.maveniverse.maven.njord.shared.publisher.ArtifactPublisherRedirector;
@@ -36,36 +39,39 @@
3639
import java.util.concurrent.ConcurrentMap;
3740
import java.util.concurrent.atomic.AtomicInteger;
3841
import java.util.stream.Collectors;
42+
import org.apache.maven.model.Model;
43+
import org.eclipse.aether.artifact.Artifact;
44+
import org.eclipse.aether.repository.RemoteRepository;
3945

4046
public class DefaultSession extends CloseableConfigSupport<SessionConfig> implements Session {
4147
private final String sessionBoundStoreKey;
42-
private final DefaultSessionFactory defaultSessionFactory;
4348
private final InternalArtifactStoreManager internalArtifactStoreManager;
4449
private final ArtifactStoreWriter artifactStoreWriter;
4550
private final ArtifactStoreMerger artifactStoreMerger;
4651
private final ArtifactPublisherRedirector artifactPublisherRedirector;
4752
private final Map<String, ArtifactStorePublisherFactory> artifactStorePublisherFactories;
4853
private final Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories;
54+
private final MavenModelReaderImpl mavenModelReader;
4955

5056
public DefaultSession(
5157
SessionConfig sessionConfig,
52-
DefaultSessionFactory defaultSessionFactory,
5358
InternalArtifactStoreManagerFactory internalArtifactStoreManagerFactory,
5459
ArtifactStoreWriterFactory artifactStoreWriterFactory,
5560
ArtifactStoreMergerFactory artifactStoreMergerFactory,
5661
ArtifactPublisherRedirectorFactory artifactPublisherRedirectorFactory,
5762
Map<String, ArtifactStorePublisherFactory> artifactStorePublisherFactories,
58-
Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories) {
63+
Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories,
64+
MavenModelReaderImpl mavenModelReader) {
5965
super(sessionConfig);
6066
this.sessionBoundStoreKey = Session.class.getName() + "." + ArtifactStore.class + "." + UUID.randomUUID();
61-
this.defaultSessionFactory = requireNonNull(defaultSessionFactory);
6267
this.internalArtifactStoreManager = internalArtifactStoreManagerFactory.create(sessionConfig);
6368
this.artifactStoreWriter = requireNonNull(artifactStoreWriterFactory).create(sessionConfig);
6469
this.artifactStoreMerger = requireNonNull(artifactStoreMergerFactory).create(sessionConfig);
6570
this.artifactPublisherRedirector =
6671
requireNonNull(artifactPublisherRedirectorFactory).create(this);
6772
this.artifactStorePublisherFactories = requireNonNull(artifactStorePublisherFactories);
6873
this.artifactStoreComparatorFactories = requireNonNull(artifactStoreComparatorFactories);
74+
this.mavenModelReader = requireNonNull(mavenModelReader);
6975
}
7076

7177
@Override
@@ -113,8 +119,30 @@ public Collection<ArtifactStoreComparator> availableComparators() {
113119
.collect(Collectors.toList());
114120
}
115121

122+
@Override
123+
public Optional<Model> readEffectiveModel(Artifact artifact, List<RemoteRepository> remoteRepositories) {
124+
requireNonNull(artifact);
125+
requireNonNull(remoteRepositories);
126+
checkClosed();
127+
try {
128+
ModelResponse response = mavenModelReader.readModel(
129+
config.session(),
130+
ModelRequest.builder()
131+
.setArtifact(artifact)
132+
.setRepositories(remoteRepositories)
133+
.setRequestContext("njord")
134+
.build());
135+
return Optional.ofNullable(response.getEffectiveModel());
136+
} catch (Exception e) {
137+
logger.warn("Could not read effective model: {}", e.getMessage());
138+
return Optional.empty();
139+
}
140+
}
141+
116142
@Override
117143
public ArtifactStoreTemplate selectSessionArtifactStoreTemplate(String uri) {
144+
requireNonNull(uri);
145+
checkClosed();
118146
try {
119147
if (!uri.contains(":")) {
120148
if (uri.isEmpty()) {
@@ -151,7 +179,7 @@ public ArtifactStoreTemplate selectSessionArtifactStoreTemplate(String uri) {
151179
@Override
152180
public ArtifactStore getOrCreateSessionArtifactStore(String uri) {
153181
requireNonNull(uri);
154-
182+
checkClosed();
155183
ConcurrentMap<String, String> sessionBoundStore = getSessionBoundStore();
156184
String storeName = sessionBoundStore.computeIfAbsent(uri, k -> {
157185
try {
@@ -179,6 +207,12 @@ public ArtifactStore getOrCreateSessionArtifactStore(String uri) {
179207
} else if (uri.startsWith("store:")) {
180208
// store:xxx
181209
artifactStoreName = uri.substring(6);
210+
Optional<ArtifactStore> existingStore =
211+
internalArtifactStoreManager.selectArtifactStore(artifactStoreName);
212+
if (!existingStore.isPresent()) {
213+
throw new IllegalArgumentException("Non existing store: " + artifactStoreName);
214+
}
215+
existingStore.orElseThrow(J8Utils.OET).close();
182216
} else {
183217
throw new IllegalArgumentException("Invalid repository URI: " + uri);
184218
}
@@ -221,6 +255,7 @@ private String createUsingTemplate(String templateName) throws IOException {
221255

222256
@Override
223257
public int publishSessionArtifactStores() throws IOException {
258+
checkClosed();
224259
ConcurrentMap<String, String> sessionBoundStore = getSessionBoundStore();
225260
if (sessionBoundStore.isEmpty()) {
226261
return 0;
@@ -252,6 +287,7 @@ public int publishSessionArtifactStores() throws IOException {
252287

253288
@Override
254289
public int dropSessionArtifactStores() {
290+
checkClosed();
255291
ConcurrentMap<String, String> sessionBoundStore = getSessionBoundStore();
256292
if (sessionBoundStore.isEmpty()) {
257293
return 0;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import static java.util.Objects.requireNonNull;
1111

12+
import eu.maveniverse.maven.mima.extensions.mmr.internal.MavenModelReaderImpl;
1213
import eu.maveniverse.maven.njord.shared.SessionConfig;
1314
import eu.maveniverse.maven.njord.shared.SessionFactory;
1415
import eu.maveniverse.maven.njord.shared.publisher.ArtifactPublisherRedirectorFactory;
@@ -30,6 +31,7 @@ public class DefaultSessionFactory implements SessionFactory {
3031
private final ArtifactPublisherRedirectorFactory artifactPublisherRedirectorFactory;
3132
private final Map<String, ArtifactStorePublisherFactory> artifactStorePublisherFactories;
3233
private final Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories;
34+
private final MavenModelReaderImpl mavenModelReader;
3335

3436
@Inject
3537
public DefaultSessionFactory(
@@ -38,25 +40,27 @@ public DefaultSessionFactory(
3840
ArtifactStoreMergerFactory artifactStoreMergerFactory,
3941
ArtifactPublisherRedirectorFactory artifactPublisherRedirectorFactory,
4042
Map<String, ArtifactStorePublisherFactory> artifactStorePublisherFactories,
41-
Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories) {
43+
Map<String, ArtifactStoreComparatorFactory> artifactStoreComparatorFactories,
44+
MavenModelReaderImpl mavenModelReader) {
4245
this.internalArtifactStoreManagerFactory = requireNonNull(internalArtifactStoreManagerFactory);
4346
this.artifactStoreWriterFactory = requireNonNull(artifactStoreWriterFactory);
4447
this.artifactStoreMergerFactory = requireNonNull(artifactStoreMergerFactory);
4548
this.artifactPublisherRedirectorFactory = requireNonNull(artifactPublisherRedirectorFactory);
4649
this.artifactStorePublisherFactories = requireNonNull(artifactStorePublisherFactories);
4750
this.artifactStoreComparatorFactories = requireNonNull(artifactStoreComparatorFactories);
51+
this.mavenModelReader = requireNonNull(mavenModelReader);
4852
}
4953

5054
@Override
5155
public DefaultSession create(SessionConfig sessionConfig) {
5256
return new DefaultSession(
5357
sessionConfig,
54-
this,
5558
internalArtifactStoreManagerFactory,
5659
artifactStoreWriterFactory,
5760
artifactStoreMergerFactory,
5861
artifactPublisherRedirectorFactory,
5962
artifactStorePublisherFactories,
60-
artifactStoreComparatorFactories);
63+
artifactStoreComparatorFactories,
64+
mavenModelReader);
6165
}
6266
}

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

Lines changed: 0 additions & 63 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright (c) 2023-2024 Maveniverse Org.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-v20.html
7+
*/
8+
package eu.maveniverse.maven.njord.shared.impl;
9+
10+
import eu.maveniverse.maven.mima.extensions.mmr.internal.MavenModelReaderImpl;
11+
import java.util.Collections;
12+
import javax.inject.Inject;
13+
import javax.inject.Named;
14+
import javax.inject.Provider;
15+
import javax.inject.Singleton;
16+
import org.apache.maven.model.building.ModelBuilder;
17+
import org.apache.maven.model.interpolation.StringVisitorModelInterpolator;
18+
import org.eclipse.aether.RepositorySystem;
19+
import org.eclipse.aether.impl.RemoteRepositoryManager;
20+
import org.eclipse.aether.impl.RepositoryEventDispatcher;
21+
22+
@Singleton
23+
@Named
24+
public class MavenModelReaderProvider implements Provider<MavenModelReaderImpl> {
25+
private final MavenModelReaderImpl instance;
26+
27+
@Inject
28+
public MavenModelReaderProvider(
29+
RepositorySystem repositorySystem,
30+
RemoteRepositoryManager remoteRepositoryManager,
31+
RepositoryEventDispatcher repositoryEventDispatcher,
32+
ModelBuilder modelBuilder,
33+
StringVisitorModelInterpolator stringVisitorModelInterpolator) {
34+
this.instance = new MavenModelReaderImpl(
35+
repositorySystem,
36+
remoteRepositoryManager,
37+
repositoryEventDispatcher,
38+
modelBuilder,
39+
stringVisitorModelInterpolator,
40+
Collections.emptyList());
41+
}
42+
43+
@Override
44+
public MavenModelReaderImpl get() {
45+
return instance;
46+
}
47+
}

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

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)