/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.model.ext.maven.internal; import java.text.MessageFormat; import org.eclipse.skalli.commons.ComparatorUtils; import org.eclipse.skalli.model.ext.maven.MavenCoordinate; import org.eclipse.skalli.model.ext.maven.MavenModule; import org.eclipse.skalli.model.ext.maven.MavenReactor; import org.eclipse.skalli.nexus.NexusArtifact; import org.eclipse.skalli.nexus.NexusClient; import org.eclipse.skalli.nexus.NexusSearchResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NexusVersionsResolver { private static final Logger LOG = LoggerFactory.getLogger(NexusVersionsResolver.class); private NexusClient nexusClient; public NexusVersionsResolver(NexusClient nexusClient) { this.nexusClient = nexusClient; if (this.nexusClient == null) { LOG.warn("Can't calculate artifact versions: No Nexus client available"); } } public void setNexusVersions(MavenReactor mavenReactor) { if (nexusClient == null || mavenReactor == null) { return; } setNexusVersion(mavenReactor.getCoordinate()); for (MavenModule mavenCoordinate : mavenReactor.getModules()) { if (mavenCoordinate != null) { setNexusVersion(mavenCoordinate); } } return; } void setNexusVersion(MavenModule mavenCoordinate) { if (mavenCoordinate == null) { return; } try { NexusSearchResult searchResult = nexusClient.searchArtifactVersions(mavenCoordinate.getGroupId(), mavenCoordinate.getArtefactId()); if (searchResult.getArtifacts().size() < mavenCoordinate.getVersions().size()) { LOG.warn(MessageFormat.format( "Nexus returned less versions for artifact {0}:{1} than in previous runs. Nexus index might be broken.", mavenCoordinate.getGroupId(), mavenCoordinate.getArtefactId())); } for (NexusArtifact nexusArtifact : searchResult.getArtifacts()) { mavenCoordinate.getVersions().add(nexusArtifact.getVersion()); } } catch (Exception e) { LOG.warn(MessageFormat.format("Failed to retrieve versions of artifact {0}:{1}: {2}", mavenCoordinate.getGroupId(), mavenCoordinate.getArtefactId(), e.getMessage()), e); } } public void addVersions(MavenReactor newReactor, MavenReactor oldReactor) { if (newReactor == null || oldReactor == null) { return; } if (newReactor.getCoordinate() != null && haveSameGroupArtifact(newReactor.getCoordinate(), oldReactor.getCoordinate())) { newReactor.getCoordinate().getVersions().addAll(oldReactor.getCoordinate().getVersions()); } for (MavenModule mavenCoordinate : newReactor.getModules()) { if (mavenCoordinate != null) { MavenModule oldCoordinate = findModuleCoordinate(oldReactor, mavenCoordinate); if (oldCoordinate != null) { mavenCoordinate.getVersions().addAll(oldCoordinate.getVersions()); } } } return; } private MavenModule findModuleCoordinate(MavenReactor reactor, MavenCoordinate mavenCoordinate) { if (reactor == null || mavenCoordinate == null) { return null; } for (MavenModule reactorCoordinate : reactor.getModules()) { if (haveSameGroupArtifact(mavenCoordinate, reactorCoordinate)) { return reactorCoordinate; } } return null; } private boolean haveSameGroupArtifact(MavenCoordinate c1, MavenCoordinate c2) { if (c1 == null && c2 == null) { return true; } if (c1 == null) { return false; } if (c2 == null) { return false; } if (ComparatorUtils.compare(c1.getGroupId(), c2.getGroupId()) != 0) { return false; } if (ComparatorUtils.compare(c1.getArtefactId(), c2.getArtefactId()) != 0) { return false; } return true; } }