package org.jboss.windup.config.loader; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.Callable; import javax.inject.Inject; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.Addon; import org.jboss.forge.furnace.lock.LockMode; import org.jboss.forge.furnace.spi.ExportedInstance; import org.jboss.forge.furnace.util.AddonFilters; import org.jboss.windup.config.RuleProvider; import org.jboss.windup.config.metadata.MetadataBuilder; import org.jboss.windup.config.metadata.RulesetMetadata; /** * Default implementation of {@link RuleProviderLoader} that uses {@link Furnace} to load {@link RuleProvider} instances * and establish relationships with their corresponding {@link RulesetMetadata} if available. * * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> * */ public class DefaultRuleProviderLoader implements RuleProviderLoader { @Inject private Furnace furnace; @Override public boolean isFileBased() { return false; } @Override public List<RuleProvider> getProviders(RuleLoaderContext ruleLoaderContext) { return furnace.getLockManager().performLocked(LockMode.READ, new Callable<List<RuleProvider>>() { @Override public List<RuleProvider> call() throws Exception { List<RuleProvider> result = new ArrayList<>(); Set<Addon> addons = furnace.getAddonRegistry().getAddons(AddonFilters.allStarted()); for (Addon addon : addons) { RulesetMetadata rulesetMetadata = null; ExportedInstance<RulesetMetadata> metadataInstance = addon.getServiceRegistry().getExportedInstance(RulesetMetadata.class); if (metadataInstance != null) { rulesetMetadata = metadataInstance.get(); } Set<ExportedInstance<RuleProvider>> providerInstances = addon.getServiceRegistry().getExportedInstances(RuleProvider.class); for (ExportedInstance<RuleProvider> instance : providerInstances) { RuleProvider provider = instance.get(); if (provider.getMetadata() instanceof MetadataBuilder) ((MetadataBuilder) provider.getMetadata()).setRulesetMetadata(rulesetMetadata); result.add(provider); } } return result; } }); } }