You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DefaultDependencyTreeBuilder.java 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. package org.apache.archiva.dependency.tree.maven2;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
  21. import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
  22. import org.apache.archiva.metadata.repository.MetadataResolutionException;
  23. import org.apache.archiva.metadata.repository.MetadataResolver;
  24. import org.apache.archiva.metadata.repository.RepositorySession;
  25. import org.apache.archiva.metadata.repository.RepositorySessionFactory;
  26. import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
  27. import org.apache.archiva.metadata.repository.storage.maven2.RepositoryModelResolver;
  28. import org.apache.archiva.proxy.common.WagonFactory;
  29. import org.apache.commons.lang.StringUtils;
  30. import org.apache.maven.archiva.common.utils.Slf4JPlexusLogger;
  31. import org.apache.maven.archiva.configuration.ArchivaConfiguration;
  32. import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
  33. import org.apache.maven.archiva.configuration.NetworkProxyConfiguration;
  34. import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
  35. import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
  36. import org.apache.maven.artifact.Artifact;
  37. import org.apache.maven.artifact.factory.ArtifactFactory;
  38. import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
  39. import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
  40. import org.apache.maven.artifact.metadata.ResolutionGroup;
  41. import org.apache.maven.artifact.repository.ArtifactRepository;
  42. import org.apache.maven.artifact.resolver.ArtifactCollector;
  43. import org.apache.maven.artifact.resolver.ArtifactResolutionException;
  44. import org.apache.maven.artifact.resolver.ResolutionListener;
  45. import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
  46. import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
  47. import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
  48. import org.apache.maven.artifact.versioning.ArtifactVersion;
  49. import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
  50. import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
  51. import org.apache.maven.artifact.versioning.ManagedVersionMap;
  52. import org.apache.maven.artifact.versioning.VersionRange;
  53. import org.apache.maven.model.Dependency;
  54. import org.apache.maven.model.DependencyManagement;
  55. import org.apache.maven.model.Exclusion;
  56. import org.apache.maven.model.Model;
  57. import org.apache.maven.model.building.DefaultModelBuilderFactory;
  58. import org.apache.maven.model.building.DefaultModelBuildingRequest;
  59. import org.apache.maven.model.building.ModelBuilder;
  60. import org.apache.maven.model.building.ModelBuildingException;
  61. import org.apache.maven.model.building.ModelBuildingRequest;
  62. import org.apache.maven.model.resolution.UnresolvableModelException;
  63. import org.apache.maven.repository.legacy.metadata.MetadataResolutionRequest;
  64. import org.apache.maven.shared.dependency.tree.DependencyNode;
  65. import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
  66. import org.apache.maven.shared.dependency.tree.DependencyTreeResolutionListener;
  67. import org.apache.maven.shared.dependency.tree.filter.AncestorOrSelfDependencyNodeFilter;
  68. import org.apache.maven.shared.dependency.tree.filter.DependencyNodeFilter;
  69. import org.apache.maven.shared.dependency.tree.filter.StateDependencyNodeFilter;
  70. import org.apache.maven.shared.dependency.tree.traversal.BuildingDependencyNodeVisitor;
  71. import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
  72. import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
  73. import org.apache.maven.shared.dependency.tree.traversal.FilteringDependencyNodeVisitor;
  74. import org.apache.maven.wagon.proxy.ProxyInfo;
  75. import org.slf4j.Logger;
  76. import org.slf4j.LoggerFactory;
  77. import org.springframework.stereotype.Service;
  78. import javax.annotation.PostConstruct;
  79. import javax.inject.Inject;
  80. import javax.inject.Named;
  81. import java.io.File;
  82. import java.util.ArrayList;
  83. import java.util.Collection;
  84. import java.util.Collections;
  85. import java.util.HashMap;
  86. import java.util.HashSet;
  87. import java.util.LinkedHashSet;
  88. import java.util.List;
  89. import java.util.Map;
  90. import java.util.Set;
  91. /**
  92. * Default implementation of <code>DependencyTreeBuilder</code>. Customized wrapper for maven-dependency-tree to use
  93. * maven-model-builder instead of maven-project. Note that the role must differ to avoid conflicting with the
  94. * maven-shared implementation.
  95. * <p/>
  96. * plexus.component role="org.apache.archiva.dependency.tree.maven2.DependencyTreeBuilder" role-hint="maven2"
  97. */
  98. @Service( "dependencyTreeBuilder#maven2" )
  99. public class DefaultDependencyTreeBuilder
  100. implements DependencyTreeBuilder
  101. {
  102. private Logger log = LoggerFactory.getLogger( getClass() );
  103. /**
  104. * plexus.requirement
  105. */
  106. private ArtifactFactory factory;
  107. /**
  108. * plexus.requirement
  109. */
  110. private ArtifactCollector collector;
  111. /**
  112. * plexus.requirement
  113. */
  114. private ModelBuilder builder;
  115. /**
  116. * TODO: can have other types, and this might eventually come through from the main request
  117. * <p/>
  118. * plexus.requirement
  119. */
  120. @Inject
  121. private RepositorySessionFactory repositorySessionFactory;
  122. /**
  123. * plexus.requirement role-hint="maven2"
  124. */
  125. @Inject
  126. @Named( value = "repositoryPathTranslator#maven2" )
  127. private RepositoryPathTranslator pathTranslator;
  128. /**
  129. * plexus.requirement
  130. */
  131. @Inject
  132. @Named( value = "archivaConfiguration#default" )
  133. private ArchivaConfiguration archivaConfiguration;
  134. @Inject
  135. private PlexusSisuBridge plexusSisuBridge;
  136. @Inject
  137. private WagonFactory wagonFactory;
  138. @PostConstruct
  139. public void initialize()
  140. throws PlexusSisuBridgeException
  141. {
  142. factory = plexusSisuBridge.lookup( ArtifactFactory.class , "default" );
  143. collector = plexusSisuBridge.lookup( ArtifactCollector.class , "default" );
  144. DefaultModelBuilderFactory defaultModelBuilderFactory = new DefaultModelBuilderFactory();
  145. builder = defaultModelBuilderFactory.newInstance();
  146. }
  147. public void buildDependencyTree( List<String> repositoryIds, String groupId, String artifactId, String version,
  148. DependencyNodeVisitor nodeVisitor )
  149. throws DependencyTreeBuilderException
  150. {
  151. DependencyTreeResolutionListener listener =
  152. new DependencyTreeResolutionListener( new Slf4JPlexusLogger( getClass() ) );
  153. Artifact projectArtifact = factory.createProjectArtifact( groupId, artifactId, version );
  154. ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, projectArtifact );
  155. if ( repository == null )
  156. {
  157. // metadata could not be resolved
  158. return;
  159. }
  160. File basedir = new File( repository.getLocation() );
  161. try
  162. {
  163. // MRM-1411
  164. List< RemoteRepositoryConfiguration > remoteRepositories = new ArrayList<RemoteRepositoryConfiguration>();
  165. Map<String, ProxyInfo > networkProxies = new HashMap<String, ProxyInfo>();
  166. Map<String, List< ProxyConnectorConfiguration >> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap();
  167. List<ProxyConnectorConfiguration> proxyConnectors = proxyConnectorsMap.get( repository.getId() );
  168. if( proxyConnectors != null )
  169. {
  170. for( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
  171. {
  172. remoteRepositories.add( archivaConfiguration.getConfiguration().findRemoteRepositoryById( proxyConnector.getTargetRepoId() ) );
  173. NetworkProxyConfiguration networkProxyConfig = archivaConfiguration.getConfiguration().getNetworkProxiesAsMap().get(
  174. proxyConnector.getProxyId() );
  175. if( networkProxyConfig != null )
  176. {
  177. ProxyInfo proxy = new ProxyInfo();
  178. proxy.setType( networkProxyConfig.getProtocol() );
  179. proxy.setHost( networkProxyConfig.getHost() );
  180. proxy.setPort( networkProxyConfig.getPort() );
  181. proxy.setUserName( networkProxyConfig.getUsername() );
  182. proxy.setPassword( networkProxyConfig.getPassword() );
  183. // key/value: remote repo ID/proxy info
  184. networkProxies.put( proxyConnector.getTargetRepoId(), proxy );
  185. }
  186. }
  187. }
  188. Model model = buildProject( new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories,
  189. networkProxies, repository ), groupId, artifactId, version );
  190. Map managedVersions = createManagedVersionMap( model );
  191. Set<Artifact> dependencyArtifacts = createArtifacts( model, null );
  192. RepositorySession repositorySession = repositorySessionFactory.createSession();
  193. try
  194. {
  195. ArtifactMetadataSource metadataSource =
  196. new MetadataArtifactMetadataSource( repositoryIds, repositorySession );
  197. // Note that we don't permit going to external repositories. We don't need to pass in a local and remote
  198. // since our metadata source has control over them
  199. //collector.collect( dependencyArtifacts, projectArtifact, managedVersions, null, null, metadataSource,
  200. // null, Collections.singletonList( listener ) );
  201. collector.collect( dependencyArtifacts, projectArtifact, null, Collections.<ArtifactRepository>emptyList(),
  202. metadataSource, null, Collections.singletonList( (ResolutionListener) listener ) );
  203. /*
  204. Set<Artifact> artifacts, Artifact originatingArtifact,
  205. ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
  206. ArtifactMetadataSource source, ArtifactFilter filter,
  207. List< ResolutionListener > listeners
  208. */
  209. }
  210. finally
  211. {
  212. repositorySession.close();
  213. }
  214. DependencyNode rootNode = listener.getRootNode();
  215. // TODO: remove the need for this when the serializer can calculate last nodes from visitor calls only
  216. DependencyNodeVisitor visitor = new BuildingDependencyNodeVisitor( nodeVisitor );
  217. CollectingDependencyNodeVisitor collectingVisitor = new CollectingDependencyNodeVisitor();
  218. DependencyNodeVisitor firstPassVisitor =
  219. new FilteringDependencyNodeVisitor( collectingVisitor, StateDependencyNodeFilter.INCLUDED );
  220. rootNode.accept( firstPassVisitor );
  221. DependencyNodeFilter secondPassFilter =
  222. new AncestorOrSelfDependencyNodeFilter( collectingVisitor.getNodes() );
  223. visitor = new FilteringDependencyNodeVisitor( visitor, secondPassFilter );
  224. rootNode.accept( visitor );
  225. }
  226. catch ( ArtifactResolutionException e )
  227. {
  228. throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e );
  229. }
  230. catch ( InvalidVersionSpecificationException e )
  231. {
  232. throw new DependencyTreeBuilderException( "Invalid dependency version for artifact " + projectArtifact );
  233. }
  234. catch ( ModelBuildingException e )
  235. {
  236. throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e );
  237. }
  238. catch ( UnresolvableModelException e )
  239. {
  240. throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e );
  241. }
  242. }
  243. private ManagedRepositoryConfiguration findArtifactInRepositories( List<String> repositoryIds, Artifact projectArtifact )
  244. {
  245. for ( String repoId : repositoryIds )
  246. {
  247. ManagedRepositoryConfiguration repositoryConfiguration =
  248. archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId );
  249. File repoDir = new File( repositoryConfiguration.getLocation() );
  250. File file = pathTranslator.toFile( repoDir, projectArtifact.getGroupId(), projectArtifact.getArtifactId(),
  251. projectArtifact.getBaseVersion(),
  252. projectArtifact.getArtifactId() + "-" + projectArtifact.getVersion()
  253. + ".pom" );
  254. if ( file.exists() )
  255. {
  256. return repositoryConfiguration;
  257. }
  258. }
  259. return null;
  260. }
  261. private Model buildProject( RepositoryModelResolver modelResolver, String groupId, String artifactId,
  262. String version )
  263. throws ModelBuildingException, UnresolvableModelException
  264. {
  265. ModelBuildingRequest req = new DefaultModelBuildingRequest();
  266. req.setProcessPlugins( false );
  267. req.setModelSource( modelResolver.resolveModel( groupId, artifactId, version ) );
  268. req.setModelResolver( modelResolver );
  269. req.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
  270. return builder.build( req ).getEffectiveModel();
  271. }
  272. // from maven-project to avoid the dependency on it
  273. private Set<Artifact> createArtifacts( Model model, ArtifactFilter dependencyFilter )
  274. throws InvalidVersionSpecificationException
  275. {
  276. Collection<Dependency> dependencies = model.getDependencies();
  277. Set<Artifact> projectArtifacts = new LinkedHashSet<Artifact>( dependencies.size() );
  278. for ( Dependency dependency : dependencies )
  279. {
  280. String scope = dependency.getScope();
  281. if ( StringUtils.isEmpty( scope ) )
  282. {
  283. scope = Artifact.SCOPE_COMPILE;
  284. dependency.setScope( scope );
  285. }
  286. VersionRange versionRange = VersionRange.createFromVersionSpec( dependency.getVersion() );
  287. Artifact artifact =
  288. factory.createDependencyArtifact( dependency.getGroupId(), dependency.getArtifactId(), versionRange,
  289. dependency.getType(), dependency.getClassifier(), scope, null,
  290. dependency.isOptional() );
  291. if ( Artifact.SCOPE_SYSTEM.equals( scope ) )
  292. {
  293. artifact.setFile( new File( dependency.getSystemPath() ) );
  294. }
  295. ArtifactFilter artifactFilter = dependencyFilter;
  296. // MNG-3769: It would be nice to be able to process relocations here,
  297. // so we could have this filtering step apply to post-relocated dependencies.
  298. // HOWEVER, this would require a much more invasive POM resolution process
  299. // in order to look for relocations, which would make the early steps in
  300. // a Maven build way too heavy.
  301. if ( artifact != null && ( artifactFilter == null || artifactFilter.include( artifact ) ) )
  302. {
  303. if ( dependency.getExclusions() != null && !dependency.getExclusions().isEmpty() )
  304. {
  305. List<String> exclusions = new ArrayList<String>();
  306. for ( Object o : dependency.getExclusions() )
  307. {
  308. Exclusion e = (Exclusion) o;
  309. exclusions.add( e.getGroupId() + ":" + e.getArtifactId() );
  310. }
  311. ArtifactFilter newFilter = new ExcludesArtifactFilter( exclusions );
  312. if ( artifactFilter != null )
  313. {
  314. AndArtifactFilter filter = new AndArtifactFilter();
  315. filter.add( artifactFilter );
  316. filter.add( newFilter );
  317. artifactFilter = filter;
  318. }
  319. else
  320. {
  321. artifactFilter = newFilter;
  322. }
  323. }
  324. artifact.setDependencyFilter( artifactFilter );
  325. projectArtifacts.add( artifact );
  326. }
  327. }
  328. return projectArtifacts;
  329. }
  330. // from maven-project to avoid the dependency on it
  331. private Map createManagedVersionMap( Model model )
  332. throws InvalidVersionSpecificationException
  333. {
  334. DependencyManagement dependencyManagement = model.getDependencyManagement();
  335. Map<String, Artifact> map = null;
  336. List<Dependency> deps;
  337. if ( ( dependencyManagement != null ) && ( ( deps = dependencyManagement.getDependencies() ) != null ) && (
  338. deps.size() > 0 ) )
  339. {
  340. map = new ManagedVersionMap( map );
  341. for ( Dependency dependency : dependencyManagement.getDependencies() )
  342. {
  343. VersionRange versionRange = VersionRange.createFromVersionSpec( dependency.getVersion() );
  344. Artifact artifact =
  345. factory.createDependencyArtifact( dependency.getGroupId(), dependency.getArtifactId(), versionRange,
  346. dependency.getType(), dependency.getClassifier(),
  347. dependency.getScope(), dependency.isOptional() );
  348. log.debug( "artifact {}", artifact );
  349. // If the dependencyManagement section listed exclusions,
  350. // add them to the managed artifacts here so that transitive
  351. // dependencies will be excluded if necessary.
  352. if ( ( null != dependency.getExclusions() ) && !dependency.getExclusions().isEmpty() )
  353. {
  354. List<String> exclusions = new ArrayList<String>();
  355. for ( Exclusion exclusion : dependency.getExclusions() )
  356. {
  357. exclusions.add( exclusion.getGroupId() + ":" + exclusion.getArtifactId() );
  358. }
  359. ExcludesArtifactFilter eaf = new ExcludesArtifactFilter( exclusions );
  360. artifact.setDependencyFilter( eaf );
  361. }
  362. else
  363. {
  364. artifact.setDependencyFilter( null );
  365. }
  366. map.put( dependency.getManagementKey(), artifact );
  367. }
  368. }
  369. else
  370. {
  371. map = Collections.emptyMap();
  372. }
  373. return map;
  374. }
  375. private class MetadataArtifactMetadataSource
  376. implements ArtifactMetadataSource
  377. {
  378. private final List<String> repositoryIds;
  379. private final RepositorySession session;
  380. private final MetadataResolver resolver;
  381. public MetadataArtifactMetadataSource( List<String> repositoryIds, RepositorySession session )
  382. {
  383. this.repositoryIds = repositoryIds;
  384. this.session = session;
  385. resolver = this.session.getResolver();
  386. }
  387. // modified version from MavenMetadataSource to work with the simpler environment
  388. public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository,
  389. List remoteRepositories )
  390. throws ArtifactMetadataRetrievalException
  391. {
  392. // TODO: we removed relocation support here. This is something that might need to be generically handled
  393. // throughout this module
  394. Artifact pomArtifact =
  395. factory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
  396. artifact.getScope() );
  397. ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, pomArtifact );
  398. Model project = null;
  399. if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) && repository != null )
  400. {
  401. File basedir = new File( repository.getLocation() );
  402. try
  403. {
  404. project =
  405. buildProject( new RepositoryModelResolver( basedir, pathTranslator ), artifact.getGroupId(),
  406. artifact.getArtifactId(), artifact.getVersion() );
  407. }
  408. catch ( ModelBuildingException e )
  409. {
  410. throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact );
  411. }
  412. catch ( UnresolvableModelException e )
  413. {
  414. throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact );
  415. }
  416. }
  417. ResolutionGroup result;
  418. if ( project == null )
  419. {
  420. // TODO: we could record this so that it is displayed in the dependency tree as (...) or similar
  421. // if the project is null, we encountered an invalid model (read: m1 POM)
  422. // we'll just return an empty resolution group.
  423. // or used the inherited scope (should that be passed to the buildFromRepository method above?)
  424. result = new ResolutionGroup( pomArtifact, Collections.<Artifact>emptySet(), Collections.<ArtifactRepository>emptyList() );
  425. }
  426. else
  427. {
  428. Set<Artifact> artifacts = Collections.emptySet();
  429. if ( !artifact.getArtifactHandler().isIncludesDependencies() )
  430. {
  431. try
  432. {
  433. artifacts = createArtifacts( project, artifact.getDependencyFilter() );
  434. }
  435. catch ( InvalidVersionSpecificationException e )
  436. {
  437. throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact );
  438. }
  439. }
  440. result = new ResolutionGroup( pomArtifact, artifacts, Collections.<ArtifactRepository>emptyList() );
  441. }
  442. return result;
  443. }
  444. public List retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository,
  445. List remoteRepositories )
  446. throws ArtifactMetadataRetrievalException
  447. {
  448. Set<ArtifactVersion> versions = new HashSet<ArtifactVersion>();
  449. for ( String repoId : repositoryIds )
  450. {
  451. Collection<String> projectVersions;
  452. try
  453. {
  454. projectVersions = resolver.resolveProjectVersions( session, repoId, artifact.getGroupId(),
  455. artifact.getArtifactId() );
  456. }
  457. catch ( MetadataResolutionException e )
  458. {
  459. throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact );
  460. }
  461. for ( String version : projectVersions )
  462. {
  463. versions.add( new DefaultArtifactVersion( version ) );
  464. }
  465. }
  466. return new ArrayList<ArtifactVersion>( versions );
  467. }
  468. public ResolutionGroup retrieve( MetadataResolutionRequest metadataResolutionRequest )
  469. throws ArtifactMetadataRetrievalException
  470. {
  471. //TODO
  472. return null;
  473. }
  474. public List<ArtifactVersion> retrieveAvailableVersions( MetadataResolutionRequest metadataResolutionRequest )
  475. throws ArtifactMetadataRetrievalException
  476. {
  477. //TODO
  478. return null;
  479. }
  480. public List<ArtifactVersion> retrieveAvailableVersionsFromDeploymentRepository( Artifact artifact,
  481. ArtifactRepository artifactRepository,
  482. ArtifactRepository artifactRepository1 )
  483. throws ArtifactMetadataRetrievalException
  484. {
  485. // TODO
  486. return null;
  487. }
  488. }
  489. public ArtifactFactory getFactory()
  490. {
  491. return factory;
  492. }
  493. }