package org.jboss.windup.exec.updater;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.apache.commons.io.FileUtils;
import org.jboss.forge.addon.dependencies.Coordinate;
import org.jboss.forge.addon.dependencies.Dependency;
import org.jboss.forge.addon.dependencies.DependencyException;
import org.jboss.forge.addon.dependencies.DependencyResolver;
import org.jboss.forge.addon.dependencies.builder.CoordinateBuilder;
import org.jboss.forge.addon.dependencies.builder.DependencyQueryBuilder;
import org.jboss.forge.addon.maven.resources.MavenModelResource;
import org.jboss.forge.addon.resource.FileResource;
import org.jboss.forge.addon.resource.ResourceFactory;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.versions.SingleVersion;
import org.jboss.windup.util.PathUtil;
import org.jboss.windup.util.ZipUtil;
import org.jboss.windup.util.exception.WindupException;
/**
* Encloses the functionality of updating the rulesets.
*
* @author mbriskar
* @author Ondrej Zizka, ozizka at redhat.com
*/
public class RulesetsUpdater
{
private static final Logger LOG = Logger.getLogger( RulesetsUpdater.class.getName() );
private static final String RULESETS_ARTIFACT_ID = "windup-rulesets";
private static final String RULES_GROUP_ID = "org.jboss.windup.rules";
public static final String RULESET_CORE_DIRECTORY = "migration-core";
@Inject
private Furnace furnace;
@Inject
private DependencyResolver depsResolver;
@Inject
ResourceFactory factory;
// This may be called (and print the message) twice - first in RulesetUpdateChecker, then here.
// TODO: This should be redesigned - first, do a query for current and latest version.
// Then use the result to print and to compare, as needed.
public boolean rulesetsNeedUpdate(boolean printVersions)
{
return false;
/* Temporary disabled
SingleVersion latest = getLatestCoreRulesetVersion();
if (latest == null)
{
LOG.info("Could not query the latest core version.");
return false;
}
SingleVersion installed = getCurrentCoreRulesetsVersion();
if (installed == null)
{
LOG.warning("Could not detect the current core rulesets version.");
return false;
}
if (printVersions)
printRulesetsVersions(installed, latest);
return 0 > installed.compareTo(latest);
*/
}
private SingleVersion getCurrentCoreRulesetsVersion()
{
Path windupRulesDir = getRulesetsDir();
Path coreRulesPomPath = windupRulesDir.resolve(RULESET_CORE_DIRECTORY + "/META-INF/maven/org.jboss.windup.rules/windup-rulesets/pom.xml");
File pomXml = coreRulesPomPath.toFile();
if (!pomXml.exists())
return null;
MavenModelResource pom = (MavenModelResource) factory.create(pomXml);
return SingleVersion.valueOf(pom.getCurrentModel().getVersion());
}
public void printRulesetsVersions(SingleVersion installed, SingleVersion latest)
{
final String msg = "Core rulesets version: Installed: " + installed + " Latest release: " + latest;
LOG.info(msg);
System.out.println(msg); // Print to both to have the info in the log too.
}
/**
* @return The directory which this updater works with.
*/
public Path getRulesetsDir()
{
Path windupRulesDir = PathUtil.getWindupRulesDir();
return windupRulesDir;
}
public String replaceRulesetsDirectoryWithLatestReleaseIfAny() throws IOException, DependencyException
{
if (!this.rulesetsNeedUpdate(false))
return null;
Path windupRulesDir = getRulesetsDir();
Path coreRulesetsDir = windupRulesDir.resolve(RULESET_CORE_DIRECTORY);
Coordinate rulesetsCoord = getLatestReleaseOf(RULES_GROUP_ID, RULESETS_ARTIFACT_ID);
if(rulesetsCoord == null)
throw new WindupException("No Windup rulesets release found.");
FileUtils.deleteDirectory(coreRulesetsDir.toFile());
extractArtifact(rulesetsCoord, coreRulesetsDir.toFile());
return rulesetsCoord.getVersion();
}
public void extractArtifact(Coordinate artifactCoords, File targetDir) throws IOException, DependencyException
{
final DependencyQueryBuilder query = DependencyQueryBuilder.create(artifactCoords);
Dependency dependency = depsResolver.resolveArtifact(query);
FileResource<?> artifact = dependency.getArtifact();
ZipUtil.unzipToFolder(new File(artifact.getFullyQualifiedName()), targetDir);
}
/**
* A convenience method.
* @return Finds the latest non-SNAPSHOT of given artifact.
*/
public Coordinate getLatestReleaseOf(String groupId, String artifactId)
{
final CoordinateBuilder coord = CoordinateBuilder.create()
.setGroupId(groupId)
.setArtifactId(artifactId);
return getLatestReleaseOf(coord);
}
/**
* @return Finds the latest non-SNAPSHOT of given artifact.
*/
public Coordinate getLatestReleaseOf(final CoordinateBuilder coord)
{
List<Coordinate> availableVersions = depsResolver.resolveVersions(DependencyQueryBuilder.create(coord));
// Find the latest non-SNAPSHOT and non-CR version.
for(int i = availableVersions.size()-1; i >= 0; i--)
{
Coordinate availableCoord = availableVersions.get(i);
String versionStr = availableCoord.getVersion();
if(versionStr != null && !availableCoord.isSnapshot() && !versionStr.matches(".*CR[0-9]$"))
return availableCoord;
}
return null;
}
/**
* Connects to a repository and returns the version of the latest windup-distribution.
*/
public Coordinate queryLatestWindupRelease()
{
final CoordinateBuilder coords = CoordinateBuilder.create()
.setGroupId("org.jboss.windup")
.setArtifactId("windup-distribution")
.setClassifier("offline")
.setPackaging("zip");
Coordinate coord = this.getLatestReleaseOf(coords);
return coord;
}
/**
* @return The version of this running instance of Windup. Takes the windup-exec addon version as authoritative.
*/
public String getCurrentRunningWindupVersion()
{
return getClass().getPackage().getImplementationVersion();
}
private SingleVersion getLatestCoreRulesetVersion()
{
Coordinate lastRelease = this.getLatestReleaseOf(RULES_GROUP_ID, RULESETS_ARTIFACT_ID);
if (lastRelease == null)
return null;
return new SingleVersion(lastRelease.getVersion());
}
}