package org.jboss.windup.config.metadata;
import java.util.ArrayList;
import java.util.List;
import org.jboss.windup.config.furnace.FurnaceHolder;
import org.jboss.windup.config.loader.RuleLoaderContext;
/**
* Provides a mechanism for transforming from one {@link TechnologyReference} to another.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class TechnologyReferenceTransformer
{
private static final String KEY = TechnologyReferenceTransformer.class.getCanonicalName();
private final TechnologyReference original;
private final TechnologyReference target;
/**
* Creates a transformer that converts references matching the original, to one matching the given destination.
*/
public TechnologyReferenceTransformer(TechnologyReference original, TechnologyReference target)
{
this.original = original;
this.target = target;
}
/**
* Gets the transformers for the given graph context, or loads them if necessary.
*/
public static List<TechnologyReferenceTransformer> getTransformers(RuleLoaderContext ruleLoaderContext)
{
List<TechnologyReferenceTransformer> transformerList = new ArrayList<>();
Iterable<TechnologyReferenceTransformerLoader> loaders = FurnaceHolder.getFurnace().getAddonRegistry()
.getServices(TechnologyReferenceTransformerLoader.class);
loaders.forEach((loader) -> {
transformerList.addAll(loader.loadTransformers(ruleLoaderContext));
});
return transformerList;
}
/**
* Gets the type to transform from.
*/
public TechnologyReference getOriginal()
{
return original;
}
/**
* Gets the type to transform to.
*/
public TechnologyReference getTarget()
{
return target;
}
/**
* If the given reference matches the original, then this will return the target {@link TechnologyReference}.
*/
public TechnologyReference transform(TechnologyReference reference)
{
if (this.original.matches(reference))
return target;
else
return reference;
}
/**
* If the given reference matches the original, then this will return the target {@link TechnologyReference}.
*/
public TechnologyReference transform(String idAndVersion)
{
TechnologyReference reference = TechnologyReference.parseFromIDAndVersion(idAndVersion);
if (this.original.matches(reference))
return target;
else
return reference;
}
}