package org.jboss.windup.config.parser;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.util.Visitor;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.TechnologyMetadata;
import org.jboss.windup.config.metadata.TechnologyMetadataLoader;
import org.jboss.windup.config.metadata.TechnologyReference;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.WindupConfigurationModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.WindupConfigurationService;
import org.jboss.windup.util.file.FileSuffixPredicate;
import org.jboss.windup.util.file.FileVisit;
/**
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class XMLTechnologyMetadataLoader implements TechnologyMetadataLoader
{
private static final String XML_EXTENSION = "\\.technology\\.metadata\\.xml";
@Inject
private Furnace furnace;
private List<TechnologyMetadata> metadataList;
private void load(final GraphContext context)
{
this.metadataList = new ArrayList<>();
WindupConfigurationModel cfg = WindupConfigurationService.getConfigurationModel(context);
for (FileModel userRulesFileModel : cfg.getUserRulesPaths())
{
Visitor<File> visitor = new Visitor<File>()
{
@Override
public void visit(File file)
{
loadMetadata(file);
}
};
FileVisit.visit(userRulesFileModel.asFile(), new FileSuffixPredicate(XML_EXTENSION), visitor);
}
}
private void loadMetadata(File file)
{
RuleLoaderContext loaderContext = new RuleLoaderContext(Collections.singleton(file.toPath()), null);
ParserContext parser = new ParserContext(furnace, loaderContext);
parser.setXmlInputPath(file.toPath());
parser.setXmlInputRootPath(file.getParentFile().toPath());
TechnologyMetadata metadata = parser.processDocument(file.toURI());
metadataList.add(metadata);
}
private void loadMetadataIfNeeded(GraphContext context)
{
if (this.metadataList == null)
{
synchronized (this)
{
if (this.metadataList == null)
load(context);
}
}
}
@Override
public TechnologyMetadata getMetadata(GraphContext context, TechnologyReference reference)
{
loadMetadataIfNeeded(context);
for (TechnologyMetadata metadata : metadataList)
{
if (metadata.handles(reference))
return metadata;
}
return null;
}
}