Skip to content

Commit ad5a7b0

Browse files
committed
Adjust Repository session util
1 parent 489d023 commit ad5a7b0

5 files changed

Lines changed: 175 additions & 23 deletions

File tree

org.eclipse.m2e.apt.core/src/org/eclipse/m2e/apt/internal/utils/PluginDependencyResolver.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import org.slf4j.Logger;
2424
import org.slf4j.LoggerFactory;
2525

26-
import org.eclipse.aether.DefaultRepositorySystemSession;
2726
import org.eclipse.aether.RepositorySystem;
27+
import org.eclipse.aether.RepositorySystemSession;
2828
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
2929
import org.eclipse.aether.collection.CollectRequest;
3030
import org.eclipse.aether.collection.DependencyGraphTransformer;
@@ -56,6 +56,7 @@
5656
import org.eclipse.m2e.core.embedder.IMaven;
5757
import org.eclipse.m2e.core.embedder.MavenModelManager;
5858
import org.eclipse.m2e.core.internal.MavenPluginActivator;
59+
import org.eclipse.m2e.internal.maven.compat.RepositorySessionUtil;
5960

6061

6162
@SuppressWarnings("restriction")
@@ -76,11 +77,11 @@ public synchronized List<File> getResolvedPluginDependencies(MavenSession mavenS
7677

7778
IMaven maven = MavenPlugin.getMaven();
7879

79-
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(mavenSession.getRepositorySession());
80+
RepositorySystemSession session = RepositorySessionUtil.newSession(mavenSession.getRepositorySession());
8081

8182
DependencyGraphTransformer transformer = new ConflictResolver(new NearestVersionSelector(), new JavaScopeSelector(),
8283
new SimpleOptionalitySelector(), new JavaScopeDeriver());
83-
session.setDependencyGraphTransformer(
84+
RepositorySessionUtil.setDependencyGraphTransformer(session,
8485
new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner()));
8586

8687
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();

org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenModelManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.w3c.dom.Element;
4545
import org.w3c.dom.NamedNodeMap;
4646

47-
import org.eclipse.aether.DefaultRepositorySystemSession;
4847
import org.eclipse.aether.RepositorySystemSession;
4948
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
5049
import org.eclipse.aether.collection.CollectRequest;
@@ -81,6 +80,7 @@
8180
import org.eclipse.m2e.core.internal.embedder.PlexusContainerManager;
8281
import org.eclipse.m2e.core.project.IMavenProjectFacade;
8382
import org.eclipse.m2e.core.project.IMavenProjectRegistry;
83+
import org.eclipse.m2e.internal.maven.compat.RepositorySessionUtil;
8484

8585

8686
/**
@@ -213,16 +213,16 @@ public synchronized DependencyNode readDependencyTree(IMavenProjectFacade contex
213213

214214
DependencyNode readDependencyTree(RepositorySystemSession repositorySession, MavenProject mavenProject, String scope)
215215
throws CoreException {
216-
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(repositorySession);
216+
RepositorySystemSession session = RepositorySessionUtil.newSession(repositorySession);
217217

218218
//
219219
// Taken from MavenRepositorySystemSession.newSession()
220220
//
221221
ConflictResolver transformer = new ConflictResolver(new NearestVersionSelector(), new JavaScopeSelector(),
222222
new SimpleOptionalitySelector(), new JavaScopeDeriver());
223-
session.setDependencyGraphTransformer(transformer);
224-
session.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, Boolean.toString(true));
225-
session.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
223+
RepositorySessionUtil.setDependencyGraphTransformer(session, transformer);
224+
RepositorySessionUtil.setConfigProperty(session, ConflictResolver.CONFIG_PROP_VERBOSE, Boolean.toString(true));
225+
RepositorySessionUtil.setConfigProperty(session, DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
226226

227227
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
228228
try {

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/FilterRepositorySystemSession.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313

1414
package org.eclipse.m2e.core.internal.embedder;
1515

16-
import org.eclipse.aether.DefaultRepositorySystemSession;
16+
import org.eclipse.aether.RepositorySystemSession;
1717
import org.eclipse.aether.SessionData;
1818
import org.eclipse.aether.transfer.TransferListener;
1919

20+
import org.eclipse.m2e.internal.maven.compat.RepositorySessionUtil;
21+
2022

2123
/**
2224
* FilterRepositorySystemSession implementation that allows setting of some/relevant session attributes.
@@ -27,9 +29,9 @@ class FilterRepositorySystemSession extends org.eclipse.aether.AbstractForwardin
2729

2830
private final String updatePolicy;
2931

30-
private final DefaultRepositorySystemSession session;
32+
private final RepositorySystemSession session;
3133

32-
public FilterRepositorySystemSession(DefaultRepositorySystemSession session, String updatePolicy) {
34+
public FilterRepositorySystemSession(RepositorySystemSession session, String updatePolicy) {
3335
this.session = session;
3436
this.updatePolicy = updatePolicy;
3537
}
@@ -40,21 +42,15 @@ public String getUpdatePolicy() {
4042
}
4143

4244
public TransferListener setTransferListener(TransferListener transferListener) {
43-
DefaultRepositorySystemSession session = getSession();
44-
TransferListener origTransferListener = session.getTransferListener();
45-
session.setTransferListener(transferListener);
46-
return origTransferListener;
45+
return RepositorySessionUtil.setTransferListener(getSession(), transferListener);
4746
}
4847

4948
public SessionData setData(SessionData data) {
50-
DefaultRepositorySystemSession session = getSession();
51-
SessionData origSessionData = session.getData();
52-
session.setData(data);
53-
return origSessionData;
49+
return RepositorySessionUtil.setData(getSession(), data);
5450
}
5551

5652
@Override
57-
protected DefaultRepositorySystemSession getSession() {
53+
protected RepositorySystemSession getSession() {
5854
return this.session;
5955
}
6056
}

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import java.util.function.Function;
3333

3434
import org.eclipse.aether.ConfigurationProperties;
35-
import org.eclipse.aether.DefaultRepositorySystemSession;
35+
import org.eclipse.aether.RepositorySystemSession;
3636
import org.eclipse.aether.transfer.TransferListener;
3737
import org.eclipse.core.runtime.CoreException;
3838
import org.eclipse.core.runtime.IProgressMonitor;
@@ -59,7 +59,6 @@
5959
import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
6060
import org.apache.maven.lifecycle.internal.MojoExecutor;
6161
import org.apache.maven.plugin.BuildPluginManager;
62-
import org.eclipse.m2e.internal.maven.compat.LifecycleExecutionPlanCalculatorFacade;
6362
import org.apache.maven.plugin.LegacySupport;
6463
import org.apache.maven.plugin.MojoExecution;
6564
import org.apache.maven.project.DefaultProjectBuildingRequest;
@@ -78,7 +77,9 @@
7877
import org.eclipse.m2e.core.embedder.MavenSettingsLocations;
7978
import org.eclipse.m2e.core.internal.MavenPluginActivator;
8079
import org.eclipse.m2e.core.internal.Messages;
80+
import org.eclipse.m2e.internal.maven.compat.LifecycleExecutionPlanCalculatorFacade;
8181
import org.eclipse.m2e.internal.maven.compat.ReadonlyMavenExecutionRequest;
82+
import org.eclipse.m2e.internal.maven.compat.RepositorySessionUtil;
8283

8384

8485

@@ -592,8 +593,9 @@ public IComponentLookup getComponentLookup() {
592593

593594
static FilterRepositorySystemSession createRepositorySession(MavenExecutionRequest request,
594595
IMavenConfiguration configuration, IComponentLookup lookup) throws CoreException {
595-
DefaultRepositorySystemSession session = (DefaultRepositorySystemSession) ((DefaultMaven) lookup
596+
RepositorySystemSession baseSession = ((DefaultMaven) lookup
596597
.lookup(Maven.class)).newRepositorySession(request);
598+
RepositorySystemSession session = RepositorySessionUtil.newSession(baseSession);
597599
String updatePolicy = configuration.getGlobalUpdatePolicy();
598600
return new FilterRepositorySystemSession(session, request.isUpdateSnapshots() ? null : updatePolicy);
599601
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Christoph Läubrich and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License 2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Christoph Läubrich - initial API and implementation
12+
*******************************************************************************/
13+
14+
package org.eclipse.m2e.internal.maven.compat;
15+
16+
import java.lang.reflect.Field;
17+
import java.util.Map;
18+
19+
import org.eclipse.aether.DefaultRepositorySystemSession;
20+
import org.eclipse.aether.RepositorySystemSession;
21+
import org.eclipse.aether.SessionData;
22+
import org.eclipse.aether.collection.DependencyGraphTransformer;
23+
import org.eclipse.aether.internal.impl.session.DefaultCloseableSession;
24+
import org.eclipse.aether.transfer.TransferListener;
25+
26+
/**
27+
* Compatibility layer for RepositorySystemSession to handle Maven 3 and Maven 4 differences.
28+
* This class provides methods to work with session configuration without direct dependencies
29+
* on DefaultRepositorySystemSession.
30+
* <p>
31+
* Maven 4 uses org.eclipse.aether.internal.impl.session.DefaultCloseableSession which is final
32+
* and uses private final fields without setter methods, so field reflection is used for Maven 4 compatibility.
33+
*/
34+
public class RepositorySessionUtil {
35+
36+
/**
37+
* Creates a new mutable session based on the given session.
38+
*
39+
* @param session the base session to copy from
40+
* @return a new mutable session
41+
*/
42+
public static RepositorySystemSession newSession(RepositorySystemSession session) {
43+
return new DefaultRepositorySystemSession(session);
44+
}
45+
46+
47+
/**
48+
* Sets the dependency graph transformer on the session.
49+
*
50+
* @param session the session to modify
51+
* @param transformer the transformer to set
52+
*/
53+
public static void setDependencyGraphTransformer(RepositorySystemSession session,
54+
DependencyGraphTransformer transformer) {
55+
if (session instanceof DefaultRepositorySystemSession) {
56+
((DefaultRepositorySystemSession) session).setDependencyGraphTransformer(transformer);
57+
return;
58+
}
59+
if (session instanceof DefaultCloseableSession) {
60+
setFieldValue(session, "dependencyGraphTransformer", transformer);
61+
return;
62+
}
63+
throw new IllegalArgumentException("Unsupported session type: " + session.getClass().getName());
64+
}
65+
66+
/**
67+
* Sets a configuration property on the session.
68+
*
69+
* @param session the session to modify
70+
* @param key the configuration key
71+
* @param value the configuration value
72+
*/
73+
@SuppressWarnings("unchecked")
74+
public static void setConfigProperty(RepositorySystemSession session, String key, Object value) {
75+
if (session instanceof DefaultRepositorySystemSession) {
76+
((DefaultRepositorySystemSession) session).setConfigProperty(key, value);
77+
return;
78+
}
79+
if (session instanceof DefaultCloseableSession) {
80+
Map<String, Object> configProperties = (Map<String, Object>) getFieldValue(session, "configProperties");
81+
configProperties.put(key, value);
82+
return;
83+
}
84+
throw new IllegalArgumentException("Unsupported session type: " + session.getClass().getName());
85+
}
86+
87+
/**
88+
* Sets the transfer listener on the session.
89+
*
90+
* @param session the session to modify
91+
* @param transferListener the transfer listener to set
92+
* @return the previous transfer listener
93+
*/
94+
public static TransferListener setTransferListener(RepositorySystemSession session,
95+
TransferListener transferListener) {
96+
if (session instanceof DefaultRepositorySystemSession) {
97+
DefaultRepositorySystemSession defaultSession = (DefaultRepositorySystemSession) session;
98+
TransferListener previous = defaultSession.getTransferListener();
99+
defaultSession.setTransferListener(transferListener);
100+
return previous;
101+
}
102+
if (session instanceof DefaultCloseableSession) {
103+
TransferListener previous = session.getTransferListener();
104+
setFieldValue(session, "transferListener", transferListener);
105+
return previous;
106+
}
107+
throw new IllegalArgumentException("Unsupported session type: " + session.getClass().getName());
108+
}
109+
110+
/**
111+
* Sets the session data on the session.
112+
*
113+
* @param session the session to modify
114+
* @param data the session data to set
115+
* @return the previous session data
116+
*/
117+
public static SessionData setData(RepositorySystemSession session, SessionData data) {
118+
if (session instanceof DefaultRepositorySystemSession) {
119+
DefaultRepositorySystemSession defaultSession = (DefaultRepositorySystemSession) session;
120+
SessionData previous = defaultSession.getData();
121+
defaultSession.setData(data);
122+
return previous;
123+
}
124+
if (session instanceof DefaultCloseableSession) {
125+
SessionData previous = session.getData();
126+
setFieldValue(session, "data", data);
127+
return previous;
128+
}
129+
throw new IllegalArgumentException("Unsupported session type: " + session.getClass().getName());
130+
}
131+
132+
private static void setFieldValue(RepositorySystemSession session, String fieldName, Object value) {
133+
try {
134+
Field field = session.getClass().getDeclaredField(fieldName);
135+
field.setAccessible(true);
136+
field.set(session, value);
137+
} catch (NoSuchFieldException | IllegalAccessException e) {
138+
throw new IllegalStateException(
139+
"Failed to set field " + fieldName + " on session type: " + session.getClass().getName(), e);
140+
}
141+
}
142+
143+
private static Object getFieldValue(RepositorySystemSession session, String fieldName) {
144+
try {
145+
Field field = session.getClass().getDeclaredField(fieldName);
146+
field.setAccessible(true);
147+
return field.get(session);
148+
} catch (NoSuchFieldException | IllegalAccessException e) {
149+
throw new IllegalStateException(
150+
"Failed to get field " + fieldName + " on session type: " + session.getClass().getName(), e);
151+
}
152+
}
153+
}

0 commit comments

Comments
 (0)