package org.jboss.windup.rules.apps.java.scan.ast;
import org.jboss.windup.rules.apps.java.scan.ast.trie.TriePrefixStructure;
import org.jboss.windup.rules.apps.java.scan.ast.trie.TrieStructureTypeRelation;
/**
* A trie structure that distributes regexes based on the prefix that is achievable. Then when the type interest is searched, it will search based on
* it's prefix up to the point where no regexes are found.
*
* Example: Save regex "abc{*}a" in the node with prefix "abc" by providing transforming method from "abc{*}a" to "abc" accordingly. Then for the
* String "abca", all the regexes saved in "","a","ab","abc","abca" will be checked, but not any other.
*/
public class TypeInterestFactoryTrie extends TriePrefixStructure<RewritePatternToRegex, String>
{
/**
* Gets the default instance of the {@link TypeInterestFactoryTrie}.
*/
public static TypeInterestFactoryTrie newDefaultInstance()
{
TrieStructureTypeRelation<RewritePatternToRegex, String> relation = new TrieStructureTypeRelation<RewritePatternToRegex, String>()
{
@Override
public String getStringToSearchFromSearchType(String search)
{
return search;
}
@Override
public String getStringPrefixToSaveSaveType(RewritePatternToRegex save)
{
/**
* Take the prefix of the windup regex and save it in the node up to the first "{..}"
*/
return save.getRewritePattern().split("\\{")[0];
}
@Override
public boolean checkIfMatchFound(RewritePatternToRegex saved, String searched)
{
return saved.getCompiledRegex().matcher(searched).matches();
}
};
return new TypeInterestFactoryTrie(relation);
}
private TypeInterestFactoryTrie(TrieStructureTypeRelation relation)
{
super(relation);
}
}