use of org.commonjava.maven.atlas.ident.version.SingleVersion in project galley by Commonjava.
the class VersionResolverImpl method addSnapshotFrom.
private void addSnapshotFrom(final MavenMetadataView metadata, final Location location, final ProjectVersionRef ref, final Map<SingleVersion, Location> available) throws GalleyMavenException {
final String version = metadata.resolveSingleValue(SNAP_VERSION_XPATH);
logger.debug("Latest snapshot version in metadata is: {}", version);
if (version != null) {
try {
final SingleVersion ver = VersionUtils.createSingleVersion(version);
if (!available.containsKey(ver)) {
logger.debug("Found candidate snapshot: {}", ver);
available.put(ver, location);
}
} catch (final InvalidVersionSpecificationException e) {
debug("Unparsable version spec found in metadata: '%s' for: %s from: %s", e, version, ref, location);
}
}
}
use of org.commonjava.maven.atlas.ident.version.SingleVersion in project galley by Commonjava.
the class VersionResolverImpl method resolveFirstSnapshotRefWithLocation.
private ProjectVersionRefLocation resolveFirstSnapshotRefWithLocation(final List<? extends Location> locations, final ProjectVersionRef ref, final VersionSelectionStrategy selectionStrategy, final EventMetadata eventMetadata) throws TransferException {
for (final Location location : locations) {
final Map<SingleVersion, Location> available = new TreeMap<>();
try {
final MavenMetadataView metadata = metadataReader.getMetadata(ref, Collections.singletonList(location), eventMetadata);
if (metadata != null) {
addSnapshotFrom(metadata, location, ref, available);
}
} catch (final GalleyMavenException e) {
debug("Failed to resolve/parse metadata for snapshot version of: %s from: %s.", e, ref, location);
}
if (!available.isEmpty()) {
final List<SingleVersion> versions = new ArrayList<>(available.keySet());
Collections.sort(versions);
final SingleVersion selected = selectionStrategy.select(versions);
if (selected == null) {
continue;
}
return new ProjectVersionRefLocation(ref.selectVersion(selected), available.get(selected));
}
}
return null;
}
use of org.commonjava.maven.atlas.ident.version.SingleVersion in project galley by Commonjava.
the class VersionResolverImpl method resolveLatestMultiRefWithLocation.
private ProjectVersionRefLocation resolveLatestMultiRefWithLocation(final List<? extends Location> locations, final ProjectVersionRef ref, final VersionSelectionStrategy selectionStrategy, final EventMetadata eventMetadata) throws TransferException {
final Map<SingleVersion, Location> available = new TreeMap<>();
for (final Location location : locations) {
try {
final MavenMetadataView metadata = metadataReader.getMetadata(ref.asProjectRef(), Collections.singletonList(location), eventMetadata);
if (metadata != null) {
final List<String> versions = metadata.resolveValues("/metadata/versioning/versions/version");
if (versions != null) {
for (final String version : versions) {
try {
final SingleVersion spec = VersionUtils.createSingleVersion(version);
if (!available.containsKey(spec)) {
available.put(spec, location);
}
} catch (final InvalidVersionSpecificationException e) {
debug("Unparsable version spec found in metadata: '%s' for: %s from: %s.", e, version, ref, location);
}
}
}
}
} catch (final GalleyMavenException e) {
debug("Failed to resolve/parse metadata for variable version of: '%s' from: %s.", e, ref, location);
}
}
if (!available.isEmpty()) {
final VersionSpec spec = ref.getVersionSpec();
final List<SingleVersion> versions = new ArrayList<>(available.keySet());
Collections.sort(versions);
while (!versions.isEmpty()) {
final SingleVersion selected = selectionStrategy.select(versions);
if (selected == null) {
return null;
}
versions.remove(selected);
if (selected.isConcrete() && spec.contains(selected)) {
return new ProjectVersionRefLocation(ref.selectVersion(selected), available.get(selected));
}
}
}
return null;
}
use of org.commonjava.maven.atlas.ident.version.SingleVersion in project galley by Commonjava.
the class VersionResolverImpl method resolveAllSnapshotRefsWithLocations.
private List<ProjectVersionRefLocation> resolveAllSnapshotRefsWithLocations(final List<? extends Location> locations, final ProjectVersionRef ref, final VersionSelectionStrategy selectionStrategy, final EventMetadata eventMetadata) throws TransferException {
final Map<SingleVersion, Location> available = new TreeMap<>();
for (final Location location : locations) {
try {
final MavenMetadataView metadata = metadataReader.getMetadata(ref, Collections.singletonList(location), eventMetadata);
if (metadata != null) {
final String latest = metadata.resolveSingleValue("/metadata/versioning/latest");
if (latest != null) {
try {
final SingleVersion ver = VersionUtils.createSingleVersion(latest);
if (ver.isSnapshot()) {
if (!available.containsKey(ver)) {
available.put(ver, location);
}
}
} catch (final InvalidVersionSpecificationException e) {
debug("Unparsable version spec found in metadata: '%s' for: %s from: %s", e, latest, ref, location);
}
}
}
} catch (final GalleyMavenException e) {
debug("Failed to resolve/parse metadata for snapshot version of: %s from: %s.", e, ref, location);
}
}
if (!available.isEmpty()) {
return Collections.emptyList();
}
final List<SingleVersion> versions = new ArrayList<>(available.keySet());
Collections.sort(versions);
final List<ProjectVersionRefLocation> result = new ArrayList<>();
while (!versions.isEmpty()) {
final SingleVersion selected = selectionStrategy.select(versions);
if (selected != null) {
versions.remove(selected);
result.add(new ProjectVersionRefLocation(ref.selectVersion(selected), available.get(selected)));
}
}
return result;
}
use of org.commonjava.maven.atlas.ident.version.SingleVersion in project indy by Commonjava.
the class MavenMetadataMerger method merge.
@Override
public byte[] merge(final Collection<Transfer> sources, final Group group, final String path) {
Logger logger = LoggerFactory.getLogger(getClass());
logger.debug("Generating merged metadata in: {}:{}", group.getKey(), path);
final Metadata master = new Metadata();
master.setVersioning(new Versioning());
final MetadataXpp3Reader reader = new MetadataXpp3Reader();
final FileReader fr = null;
InputStream stream = null;
boolean merged = false;
Transfer snapshotProvider = null;
for (final Transfer src : sources) {
if (!src.exists()) {
continue;
}
try {
stream = src.openInputStream();
String content = IOUtils.toString(stream);
logger.debug("Adding in metadata content from: {}\n\n{}\n\n", src, content);
// there is a lot of junk in here to make up for Metadata's anemic merge() method.
final Metadata md = reader.read(new StringReader(content), false);
if (md.getGroupId() != null) {
master.setGroupId(md.getGroupId());
}
if (md.getArtifactId() != null) {
master.setArtifactId(md.getArtifactId());
}
if (md.getVersion() != null) {
master.setVersion(md.getVersion());
}
master.merge(md);
Versioning versioning = master.getVersioning();
Versioning mdVersioning = md.getVersioning();
// FIXME: Should we try to merge snapshot lists instead of using the first one we encounter??
if (versioning.getSnapshot() == null && mdVersioning != null) {
logger.info("INCLUDING snapshot information from: {} in: {}:{}", src, group.getKey(), path);
snapshotProvider = src;
versioning.setSnapshot(mdVersioning.getSnapshot());
final List<SnapshotVersion> snapshotVersions = versioning.getSnapshotVersions();
boolean added = false;
for (final SnapshotVersion snap : mdVersioning.getSnapshotVersions()) {
if (!snapshotVersions.contains(snap)) {
snapshotVersions.add(snap);
added = true;
}
}
if (added) {
Collections.sort(snapshotVersions, new SnapshotVersionComparator());
}
} else {
logger.warn("SKIPPING snapshot information from: {} in: {}:{} (obscured by: {})", src, group.getKey(), path, snapshotProvider);
}
merged = true;
} catch (final IOException e) {
final StoreKey key = getKey(src);
logger.error(String.format("Cannot read metadata: %s from artifact-store: %s. Reason: %s", src.getPath(), key, e.getMessage()), e);
} catch (final XmlPullParserException e) {
final StoreKey key = getKey(src);
logger.error(String.format("Cannot parse metadata: %s from artifact-store: %s. Reason: %s", src.getPath(), key, e.getMessage()), e);
} finally {
closeQuietly(fr);
closeQuietly(stream);
}
}
Versioning versioning = master.getVersioning();
if (versioning != null && versioning.getVersions() != null) {
if (metadataProviders != null) {
for (MavenMetadataProvider provider : metadataProviders) {
try {
Metadata toMerge = provider.getMetadata(group.getKey(), path);
if (toMerge != null) {
merged = master.merge(toMerge) || merged;
}
} catch (IndyWorkflowException e) {
logger.error(String.format("Cannot read metadata: %s from metadata provider: %s. Reason: %s", path, provider.getClass().getSimpleName(), e.getMessage()), e);
}
}
}
List<SingleVersion> versionObjects = versioning.getVersions().stream().map(VersionUtils::createSingleVersion).collect(Collectors.toList());
Collections.sort(versionObjects);
versioning.setVersions(versionObjects.stream().map(SingleVersion::renderStandard).collect(Collectors.toList()));
if (versionObjects.size() > 0) {
String latest = versionObjects.get(versionObjects.size() - 1).renderStandard();
versioning.setLatest(latest);
versioning.setRelease(latest);
}
}
if (merged) {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
new MetadataXpp3Writer().write(baos, master);
return baos.toByteArray();
} catch (final IOException e) {
logger.error(String.format("Cannot write consolidated metadata: %s to: %s. Reason: %s", path, group.getKey(), e.getMessage()), e);
}
}
return null;
}
Aggregations