|
40 | 40 | import java.util.concurrent.Executor;
|
41 | 41 | import java.util.concurrent.Executors;
|
42 | 42 | import java.util.concurrent.atomic.AtomicReference;
|
| 43 | +import java.util.function.Consumer; |
43 | 44 | import java.util.function.Supplier;
|
44 | 45 | import java.util.function.UnaryOperator;
|
45 | 46 | import java.util.regex.Matcher;
|
@@ -129,6 +130,7 @@ public class DefaultModelBuilder implements ModelBuilder {
|
129 | 130 | private static final String FILE = "file";
|
130 | 131 | private static final String IMPORT = "import";
|
131 | 132 | private static final String PARENT = "parent";
|
| 133 | + private static final String MODEL = "model"; |
132 | 134 |
|
133 | 135 | private final Logger logger = LoggerFactory.getLogger(getClass());
|
134 | 136 |
|
@@ -1025,7 +1027,8 @@ Model resolveAndReadParentExternally(Model childModel, DefaultProfileActivationC
|
1025 | 1027 | modelSource = resolveReactorModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion());
|
1026 | 1028 | if (modelSource == null) {
|
1027 | 1029 | AtomicReference<Parent> modified = new AtomicReference<>();
|
1028 |
| - modelSource = modelResolver.resolveModel(request.getSession(), repositories, parent, modified); |
| 1030 | + modelSource = new CachingModelResolver() |
| 1031 | + .resolveModel(request.getSession(), repositories, parent, modified); |
1029 | 1032 | if (modified.get() != null) {
|
1030 | 1033 | parent = modified.get();
|
1031 | 1034 | }
|
@@ -1605,9 +1608,11 @@ private DependencyManagement loadDependencyManagement(Dependency dependency, Col
|
1605 | 1608 | }
|
1606 | 1609 |
|
1607 | 1610 | Model importModel = cache(
|
| 1611 | + repositories, |
1608 | 1612 | groupId,
|
1609 | 1613 | artifactId,
|
1610 | 1614 | version,
|
| 1615 | + null, |
1611 | 1616 | IMPORT,
|
1612 | 1617 | () -> doLoadDependencyManagement(dependency, groupId, artifactId, version, importIds));
|
1613 | 1618 | DependencyManagement importMgmt = importModel != null ? importModel.getDependencyManagement() : null;
|
@@ -1641,8 +1646,8 @@ private Model doLoadDependencyManagement(
|
1641 | 1646 | try {
|
1642 | 1647 | importSource = resolveReactorModel(groupId, artifactId, version);
|
1643 | 1648 | if (importSource == null) {
|
1644 |
| - importSource = modelResolver.resolveModel( |
1645 |
| - request.getSession(), repositories, dependency, new AtomicReference<>()); |
| 1649 | + importSource = new CachingModelResolver() |
| 1650 | + .resolveModel(request.getSession(), repositories, dependency, new AtomicReference<>()); |
1646 | 1651 | }
|
1647 | 1652 | } catch (ModelBuilderException | ModelResolverException e) {
|
1648 | 1653 | StringBuilder buffer = new StringBuilder(256);
|
@@ -1711,8 +1716,15 @@ ModelSource resolveReactorModel(String groupId, String artifactId, String versio
|
1711 | 1716 | return null;
|
1712 | 1717 | }
|
1713 | 1718 |
|
1714 |
| - private <T> T cache(String groupId, String artifactId, String version, String tag, Supplier<T> supplier) { |
1715 |
| - return cache.computeIfAbsent(groupId, artifactId, version, tag, supplier); |
| 1719 | + private <T> T cache( |
| 1720 | + List<RemoteRepository> repositories, |
| 1721 | + String groupId, |
| 1722 | + String artifactId, |
| 1723 | + String version, |
| 1724 | + String classifier, |
| 1725 | + String tag, |
| 1726 | + Supplier<T> supplier) { |
| 1727 | + return cache.computeIfAbsent(repositories, groupId, artifactId, version, classifier, tag, supplier); |
1716 | 1728 | }
|
1717 | 1729 |
|
1718 | 1730 | private <T> T cache(Source source, String tag, Supplier<T> supplier) throws ModelBuilderException {
|
@@ -1801,6 +1813,85 @@ private String transformPath(String path, ActivationFile target, String location
|
1801 | 1813 | }
|
1802 | 1814 | return profiles.stream().map(new ProfileInterpolator()).toList();
|
1803 | 1815 | }
|
| 1816 | + |
| 1817 | + record ModelResolverResult(ModelSource source, String resolvedVersion) {} |
| 1818 | + |
| 1819 | + class CachingModelResolver implements ModelResolver { |
| 1820 | + @Override |
| 1821 | + public ModelSource resolveModel( |
| 1822 | + Session session, |
| 1823 | + List<RemoteRepository> repositories, |
| 1824 | + Parent parent, |
| 1825 | + AtomicReference<Parent> modified) |
| 1826 | + throws ModelResolverException { |
| 1827 | + ModelResolverResult result = cache.computeIfAbsent( |
| 1828 | + repositories, |
| 1829 | + parent.getGroupId(), |
| 1830 | + parent.getArtifactId(), |
| 1831 | + parent.getVersion(), |
| 1832 | + null, |
| 1833 | + MODEL, |
| 1834 | + () -> { |
| 1835 | + AtomicReference<Parent> mod = new AtomicReference<>(); |
| 1836 | + ModelSource res = modelResolver.resolveModel(session, repositories, parent, mod); |
| 1837 | + return new ModelResolverResult( |
| 1838 | + res, mod.get() != null ? mod.get().getVersion() : null); |
| 1839 | + }); |
| 1840 | + if (result.resolvedVersion != null && modified != null) { |
| 1841 | + modified.set(parent.withVersion(result.resolvedVersion)); |
| 1842 | + } |
| 1843 | + return result.source; |
| 1844 | + } |
| 1845 | + |
| 1846 | + @Override |
| 1847 | + public ModelSource resolveModel( |
| 1848 | + Session session, |
| 1849 | + List<RemoteRepository> repositories, |
| 1850 | + Dependency dependency, |
| 1851 | + AtomicReference<Dependency> modified) |
| 1852 | + throws ModelResolverException { |
| 1853 | + ModelResolverResult result = cache.computeIfAbsent( |
| 1854 | + repositories, |
| 1855 | + dependency.getGroupId(), |
| 1856 | + dependency.getArtifactId(), |
| 1857 | + dependency.getVersion(), |
| 1858 | + dependency.getClassifier(), |
| 1859 | + MODEL, |
| 1860 | + () -> { |
| 1861 | + AtomicReference<Dependency> mod = new AtomicReference<>(); |
| 1862 | + ModelSource res = modelResolver.resolveModel(session, repositories, dependency, mod); |
| 1863 | + return new ModelResolverResult( |
| 1864 | + res, mod.get() != null ? mod.get().getVersion() : null); |
| 1865 | + }); |
| 1866 | + if (result.resolvedVersion != null && modified != null) { |
| 1867 | + modified.set(dependency.withVersion(result.resolvedVersion)); |
| 1868 | + } |
| 1869 | + return result.source; |
| 1870 | + } |
| 1871 | + |
| 1872 | + @Override |
| 1873 | + public ModelSource resolveModel( |
| 1874 | + Session session, |
| 1875 | + List<RemoteRepository> repositories, |
| 1876 | + String groupId, |
| 1877 | + String artifactId, |
| 1878 | + String version, |
| 1879 | + String classifier, |
| 1880 | + Consumer<String> resolvedVersion) |
| 1881 | + throws ModelResolverException { |
| 1882 | + ModelResolverResult result = |
| 1883 | + cache.computeIfAbsent(repositories, groupId, artifactId, version, classifier, MODEL, () -> { |
| 1884 | + AtomicReference<String> mod = new AtomicReference<>(); |
| 1885 | + ModelSource res = modelResolver.resolveModel( |
| 1886 | + session, repositories, groupId, artifactId, version, classifier, mod::set); |
| 1887 | + return new ModelResolverResult(res, mod.get()); |
| 1888 | + }); |
| 1889 | + if (result.resolvedVersion != null) { |
| 1890 | + resolvedVersion.accept(result.resolvedVersion); |
| 1891 | + } |
| 1892 | + return result.source; |
| 1893 | + } |
| 1894 | + } |
1804 | 1895 | }
|
1805 | 1896 |
|
1806 | 1897 | @SuppressWarnings("deprecation")
|
|
0 commit comments