package org.jboss.windup.rules.apps.java.scan.operation.packagemapping;
import java.nio.file.Path;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.RuleSubset;
import org.jboss.windup.config.loader.RuleLoaderContext;
import org.jboss.windup.config.metadata.RuleProviderRegistry;
import org.jboss.windup.config.metadata.RuleProviderRegistryCache;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.GraphContextFactory;
import org.jboss.windup.graph.model.WindupConfigurationModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.FileService;
import org.jboss.windup.graph.service.WindupConfigurationService;
import org.jboss.windup.util.PathUtil;
import org.ocpsoft.rewrite.config.RuleVisit;
/**
* This registry is conceptually similar to the {@link RuleProviderRegistryCache} except that it is designed for {@link PackageNameMapping}. It allows
* callers (such as bootstrap) to find packagename mappings without fully running Windup.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class PackageNameMappingRegistry
{
private static final Logger LOG = Logger.getLogger(PackageNameMappingRegistry.class.getSimpleName());
@Inject
private GraphContextFactory graphContextFactory;
@Inject
private RuleProviderRegistryCache cache;
private GraphRewrite event;
public String getOrganizationForPackage(String packageName)
{
return PackageNameMapping.getOrganizationForPackage(this.event, packageName);
}
public void loadPackageMappings()
{
loadPackageMappings(PathUtil.getWindupRulesDir());
}
public void loadPackageMappings(Path rulesPath)
{
try (GraphContext graphContext = graphContextFactory.create())
{
WindupConfigurationModel configurationModel = WindupConfigurationService.getConfigurationModel(graphContext);
FileModel windupRulesPath = new FileService(graphContext).createByFilePath(rulesPath.toString());
configurationModel.addUserRulesPath(windupRulesPath);
RuleLoaderContext ruleLoaderContext = new RuleLoaderContext(Collections.singleton(rulesPath), null);
RuleProviderRegistry registry = cache.getRuleProviderRegistry(ruleLoaderContext);
this.event = new GraphRewrite(graphContext);
RuleSubset ruleSubset = RuleSubset.create(registry.getConfiguration());
new RuleVisit(ruleSubset).accept((r) -> {
if (r instanceof PackageNameMapping)
{
((PackageNameMapping) r).preRulesetEvaluation(event);
}
});
graphContext.clear();
}
catch (Exception e)
{
LOG.log(Level.WARNING, "Failed to load rule information due to: " + e.getMessage(), e);
}
}
}