package org.jboss.windup.rules.apps.java.scan.operation;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.Variables;
import org.jboss.windup.config.operation.Iteration;
import org.jboss.windup.config.operation.iteration.AbstractIterationOperation;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.GraphTypeManager;
import org.jboss.windup.graph.model.ArchiveModel;
import org.jboss.windup.graph.model.ArchiveType;
import org.jboss.windup.graph.model.WindupFrame;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.service.GraphService;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Adds the vertex types to ArchiveModels as per the file's extension.
*/
public class ConfigureArchiveTypes extends AbstractIterationOperation<ArchiveModel>
{
private GraphTypeManager graphTypeManager;
private HashMap<String, Class<? extends WindupVertexFrame>> suffixToModelClass = new HashMap<>();
public ConfigureArchiveTypes(String variableName, GraphTypeManager graphTypeManager)
{
super(variableName);
this.graphTypeManager = graphTypeManager;
initTypes();
}
public ConfigureArchiveTypes(GraphTypeManager graphTypeManager)
{
super();
this.graphTypeManager = graphTypeManager;
initTypes();
}
public static ConfigureArchiveTypes forVar(String variableName, GraphTypeManager graphTypeManager)
{
return new ConfigureArchiveTypes(variableName, graphTypeManager);
}
public static ConfigureArchiveTypes withTypeManager(GraphTypeManager graphTypeManager)
{
return new ConfigureArchiveTypes(graphTypeManager);
}
@Override
public void perform(GraphRewrite event, EvaluationContext context, ArchiveModel archiveModel)
{
GraphContext graphContext = event.getGraphContext();
String filename = archiveModel.getArchiveName();
WindupVertexFrame newFrame = null;
for (Map.Entry<String, Class<? extends WindupVertexFrame>> entry : suffixToModelClass.entrySet())
{
if (StringUtils.endsWith(filename, entry.getKey()))
{
newFrame = GraphService.addTypeToModel(graphContext, archiveModel, entry.getValue());
}
}
if (newFrame != null)
{
Iteration.setCurrentPayload(Variables.instance(event), getVariableName(), newFrame);
}
}
private void initTypes()
{
Set<Class<? extends WindupFrame<?>>> frameClasses = graphTypeManager.getRegisteredTypes();
for (Class<? extends WindupFrame<?>> frameClass : frameClasses)
{
// only use vertex frames for this mapping
if (!WindupVertexFrame.class.isAssignableFrom(frameClass))
continue;
@SuppressWarnings("unchecked")
Class<? extends WindupVertexFrame> vertexFrame = (Class<? extends WindupVertexFrame>)frameClass;
ArchiveType archiveType = frameClass.getAnnotation(ArchiveType.class);
if (archiveType != null)
{
this.suffixToModelClass.put(archiveType.value(), vertexFrame);
}
}
}
@Override
public String toString()
{
return "ConfigureArchiveTypes";
}
}