File metadataFile = pathTranslator.toFile( basedir, readMetadataRequest.getNamespace(),
readMetadataRequest.getProjectId(), artifactVersion,
METADATA_FILENAME );
try
{
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( metadataFile );
// re-adjust to timestamp if present, otherwise retain the original -SNAPSHOT filename
SnapshotVersion snapshotVersion = metadata.getSnapshotVersion();
if ( snapshotVersion != null )
{
artifactVersion =
artifactVersion.substring( 0, artifactVersion.length() - 8 ); // remove SNAPSHOT from end
artifactVersion =
artifactVersion + snapshotVersion.getTimestamp() + "-" + snapshotVersion.getBuildNumber();
}
}
catch ( XMLException e )
{
// unable to parse metadata - LOGGER it, and continue with the version as the original SNAPSHOT version
LOGGER.warn( "Invalid metadata: {} - {}", metadataFile, e.getMessage() );
}
}
// TODO: won't work well with some other layouts, might need to convert artifact parts to ID by path translator
String id = readMetadataRequest.getProjectId() + "-" + artifactVersion + ".pom";
File file =
pathTranslator.toFile( basedir, readMetadataRequest.getNamespace(), readMetadataRequest.getProjectId(),
readMetadataRequest.getProjectVersion(), id );
if ( !file.exists() )
{
// metadata could not be resolved
throw new RepositoryStorageMetadataNotFoundException(
"The artifact's POM file '" + file.getAbsolutePath() + "' was missing" );
}
// TODO: this is a workaround until we can properly resolve using proxies as well - this doesn't cache
// anything locally!
List<RemoteRepository> remoteRepositories = new ArrayList<>();
Map<String, NetworkProxy> networkProxies = new HashMap<>();
Map<String, List<ProxyConnector>> proxyConnectorsMap = proxyConnectorAdmin.getProxyConnectorAsMap();
List<ProxyConnector> proxyConnectors = proxyConnectorsMap.get( readMetadataRequest.getRepositoryId() );
if ( proxyConnectors != null )
{
for ( ProxyConnector proxyConnector : proxyConnectors )
{
RemoteRepository remoteRepoConfig =
remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() );
if ( remoteRepoConfig != null )
{
remoteRepositories.add( remoteRepoConfig );
NetworkProxy networkProxyConfig =
networkProxyAdmin.getNetworkProxy( proxyConnector.getProxyId() );
if ( networkProxyConfig != null )
{
// key/value: remote repo ID/proxy info
networkProxies.put( proxyConnector.getTargetRepoId(), networkProxyConfig );
}
}
}
}
// That's a browsing request so we can a mix of SNAPSHOT and release artifacts (especially with snapshots which
// can have released parent pom
if ( readMetadataRequest.isBrowsingRequest() )
{
remoteRepositories.addAll( remoteRepositoryAdmin.getRemoteRepositories() );
}
ModelBuildingRequest req =
new DefaultModelBuildingRequest().setProcessPlugins( false ).setPomFile( file ).setTwoPhaseBuilding(
false ).setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
//MRM-1607. olamy this will resolve jdk profiles on the current running archiva jvm
req.setSystemProperties( System.getProperties() );
// MRM-1411
req.setModelResolver(
new RepositoryModelResolver( managedRepository, pathTranslator, wagonFactory, remoteRepositories,
networkProxies, managedRepository ) );
Model model;
try
{
model = builder.build( req ).getEffectiveModel();
}
catch ( ModelBuildingException e )
{
String msg = "The artifact's POM file '" + file + "' was invalid: " + e.getMessage();
List<ModelProblem> modelProblems = e.getProblems();
for ( ModelProblem problem : modelProblems )
{
// MRM-1411, related to MRM-1335
// this means that the problem was that the parent wasn't resolved!
// olamy really hackhish but fail with java profile so use error message
// || ( StringUtils.startsWith( problem.getMessage(), "Failed to determine Java version for profile" ) )
// but setTwoPhaseBuilding(true) fix that
if ( ( problem.getException() instanceof FileNotFoundException && e.getModelId() != null &&
!e.getModelId().equals( problem.getModelId() ) ) )
{
LOGGER.warn( "The artifact's parent POM file '{}' cannot be resolved. "
+ "Using defaults for project version metadata..", file );
ProjectVersionMetadata metadata = new ProjectVersionMetadata();
metadata.setId( readMetadataRequest.getProjectVersion() );
MavenProjectFacet facet = new MavenProjectFacet();
facet.setGroupId( readMetadataRequest.getNamespace() );
facet.setArtifactId( readMetadataRequest.getProjectId() );
facet.setPackaging( "jar" );
metadata.addFacet( facet );
String errMsg =
"Error in resolving artifact's parent POM file. " + ( problem.getException() == null
? problem.getMessage()
: problem.getException().getMessage() );
RepositoryProblemFacet repoProblemFacet = new RepositoryProblemFacet();
repoProblemFacet.setRepositoryId( readMetadataRequest.getRepositoryId() );
repoProblemFacet.setId( readMetadataRequest.getRepositoryId() );
repoProblemFacet.setMessage( errMsg );
repoProblemFacet.setProblem( errMsg );
repoProblemFacet.setProject( readMetadataRequest.getProjectId() );
repoProblemFacet.setVersion( readMetadataRequest.getProjectVersion() );
repoProblemFacet.setNamespace( readMetadataRequest.getNamespace() );
metadata.addFacet( repoProblemFacet );
return metadata;
}
}
throw new RepositoryStorageMetadataInvalidException( "invalid-pom", msg, e );
}
// Check if the POM is in the correct location
boolean correctGroupId = readMetadataRequest.getNamespace().equals( model.getGroupId() );
boolean correctArtifactId = readMetadataRequest.getProjectId().equals( model.getArtifactId() );
boolean correctVersion = readMetadataRequest.getProjectVersion().equals( model.getVersion() );
if ( !correctGroupId || !correctArtifactId || !correctVersion )
{
StringBuilder message = new StringBuilder( "Incorrect POM coordinates in '" + file + "':" );
if ( !correctGroupId )
{
message.append( "\nIncorrect group ID: " ).append( model.getGroupId() );
}
if ( !correctArtifactId )
{
message.append( "\nIncorrect artifact ID: " ).append( model.getArtifactId() );
}
if ( !correctVersion )
{
message.append( "\nIncorrect version: " ).append( model.getVersion() );
}
throw new RepositoryStorageMetadataInvalidException( "mislocated-pom", message.toString() );
}
ProjectVersionMetadata metadata = new ProjectVersionMetadata();
metadata.setCiManagement( convertCiManagement( model.getCiManagement() ) );
metadata.setDescription( model.getDescription() );
metadata.setId( readMetadataRequest.getProjectVersion() );
metadata.setIssueManagement( convertIssueManagement( model.getIssueManagement() ) );
metadata.setLicenses( convertLicenses( model.getLicenses() ) );
metadata.setMailingLists( convertMailingLists( model.getMailingLists() ) );
metadata.setDependencies( convertDependencies( model.getDependencies() ) );
metadata.setName( model.getName() );
metadata.setOrganization( convertOrganization( model.getOrganization() ) );
metadata.setScm( convertScm( model.getScm() ) );
metadata.setUrl( model.getUrl() );
MavenProjectFacet facet = new MavenProjectFacet();
facet.setGroupId( model.getGroupId() != null ? model.getGroupId() : model.getParent().getGroupId() );
facet.setArtifactId( model.getArtifactId() );
facet.setPackaging( model.getPackaging() );
if ( model.getParent() != null )
{
MavenProjectParent parent = new MavenProjectParent();
parent.setGroupId( model.getParent().getGroupId() );
parent.setArtifactId( model.getParent().getArtifactId() );
parent.setVersion( model.getParent().getVersion() );
facet.setParent( parent );
}
metadata.addFacet( facet );
return metadata;
}
catch ( RepositoryAdminException e )
{