package org.jboss.windup.tooling.rules;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.jboss.windup.config.RuleUtils;
import org.jboss.windup.config.metadata.RuleProviderMetadata;
import org.jboss.windup.config.metadata.RuleProviderRegistryCache;
import org.jboss.windup.config.metadata.TechnologyReference;
import org.jboss.windup.config.phase.MigrationRulesPhase;
public class RuleProviderRegistryImpl implements RuleProviderRegistry
{
private static final long serialVersionUID = 1L;
private List<RuleProvider> ruleProviders = new ArrayList<>();
@Override
public List<RuleProvider> getRuleProviders()
{
return ruleProviders;
}
public void buildRuleProviders(org.jboss.windup.config.metadata.RuleProviderRegistry registry)
{
for (org.jboss.windup.config.RuleProvider provider : registry.getProviders())
{
RuleProviderMetadata ruleProviderMetadata = provider.getMetadata();
String providerID = ruleProviderMetadata.getID();
String origin = ruleProviderMetadata.getOrigin();
RuleProvider ruleProvider = new RuleProviderImpl();
ruleProvider.setProviderID(providerID);
ruleProvider.setDateLoaded(new GregorianCalendar());
ruleProvider.setDescription(ruleProviderMetadata.getDescription());
ruleProvider.setOrigin(origin);
ruleProviders.add(ruleProvider);
setFileMetaData(ruleProvider);
ruleProvider.setSources(technologyReferencesToTechnologyList(ruleProviderMetadata.getSourceTechnologies()));
ruleProvider.setTargets(technologyReferencesToTechnologyList(ruleProviderMetadata.getTargetTechnologies()));
String phase = MigrationRulesPhase.class.getSimpleName().toUpperCase();
if (ruleProviderMetadata.getPhase() != null)
phase = ruleProviderMetadata.getPhase().getSimpleName().toUpperCase();
ruleProvider.setPhase(phase);
ruleProvider.setRuleProviderType(getProviderType(origin));
List<Rule> rules = new ArrayList<>();
for (org.ocpsoft.rewrite.config.Rule rule : registry.getRules(provider))
{
String ruleID = rule.getId();
String ruleString = RuleUtils.ruleToRuleContentsString(rule, 0);
Rule ruleCopy = new RuleImpl();
ruleCopy.setRuleID(ruleID);
ruleCopy.setRuleContents(ruleString);
rules.add(ruleCopy);
}
ruleProvider.setRules(rules);
}
}
private Set<Technology> technologyReferencesToTechnologyList(Collection<TechnologyReference> technologyReferences)
{
Set<Technology> results = new HashSet<>();
for (TechnologyReference technologyReference : technologyReferences)
{
Technology technology = new TechnologyImpl();
technology.setName(technologyReference.getId());
String versionRange = technologyReference.getVersionRangeAsString();
if (StringUtils.isNotBlank(versionRange))
technology.setVersionRange(versionRange);
results.add(technology);
}
return results;
}
private void setFileMetaData(RuleProvider ruleProvider)
{
if (ruleProvider.getOrigin() == null)
return;
try
{
String filePathString = ruleProvider.getOrigin();
if (filePathString.startsWith("file:"))
filePathString = filePathString.substring(5);
Path filePath = Paths.get(filePathString);
if (!Files.isRegularFile(filePath))
return;
FileTime lastModifiedTime = Files.getLastModifiedTime(Paths.get(filePathString));
GregorianCalendar lastModifiedCalendar = new GregorianCalendar();
lastModifiedCalendar.setTimeInMillis(lastModifiedTime.toMillis());
ruleProvider.setDateModified(lastModifiedCalendar);
// TODO: Can we still find the rules path in order to get the relative path?
// filePath = Paths.get(ruleProvider.getRulesPath().getPath()).relativize(Paths.get(filePathString));
ruleProvider.setOrigin(filePath.toString());
}
catch (Exception e)
{
// not a file path... ignore
}
}
private RuleProvider.RuleProviderType getProviderType(String origin)
{
if (origin == null)
return RuleProvider.RuleProviderType.JAVA;
else if (origin.startsWith("file:") && origin.endsWith(".windup.xml"))
return RuleProvider.RuleProviderType.XML;
else if (origin.startsWith("file:") && origin.endsWith(".windup.groovy"))
return RuleProvider.RuleProviderType.GROOVY;
else
return RuleProvider.RuleProviderType.JAVA;
}
}