package org.jboss.windup.config.phase;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.proxy.Proxies;
import org.jboss.windup.config.furnace.FurnaceHolder;
/**
* @author <a href="mailto:zizka@seznam.cz">Ondrej Zizka</a>
*/
public class RulePhaseFinder {
private Map<String, Class<? extends RulePhase>> cachedPhases;
private String classNameToMapKey(String className)
{
return className.toUpperCase();
}
/**
* Finds the phase by its simple class name (case insensitive); returns null if not found.
*/
public Class<? extends RulePhase> findPhase(String phaseStr)
{
if (phaseStr == null)
return null;
if (this.cachedPhases == null)
this.cachedPhases = this.loadPhases();
return this.cachedPhases.get(classNameToMapKey(phaseStr));
}
/**
* Loads the currently known phases from Furnace to the map.
*/
private Map<String, Class<? extends RulePhase>> loadPhases()
{
Map<String, Class<? extends RulePhase>> phases;
phases = new HashMap<>();
Furnace furnace = FurnaceHolder.getFurnace();
for (RulePhase phase : furnace.getAddonRegistry().getServices(RulePhase.class))
{
@SuppressWarnings("unchecked")
Class<? extends RulePhase> unwrappedClass = (Class<? extends RulePhase>) Proxies.unwrap(phase).getClass();
String simpleName = unwrappedClass.getSimpleName();
phases.put(classNameToMapKey(simpleName), unwrappedClass);
}
return Collections.unmodifiableMap(phases);
}
/**
* Returns the phases loaded in this finder, sorted by Class.getSimpleName().
*/
public List<Class<? extends RulePhase>> getAvailablePhases() {
ArrayList<Class<? extends RulePhase>> phases = new ArrayList<>(this.cachedPhases.values());
// It could be sorted by the real order.
phases.sort(new Comparator()
{
@Override
public int compare(Object phaseClass1, Object phaseClass2)
{
if (phaseClass1 == null || !(phaseClass1 instanceof Class))
return -1;
if (phaseClass2 == null || !(phaseClass2 instanceof Class))
return 1;
String name1 = ((Class<? extends RulePhase>)phaseClass1).getSimpleName();
String name2 = ((Class<? extends RulePhase>)phaseClass2).getSimpleName();
return name1.compareToIgnoreCase(name2);
}
});
return phases;
}
}