package org.jboss.windup.util; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import org.apache.commons.lang3.StringUtils; /** * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class PackageFrequencyTrie { private PackageFrequencyTrie parent; private String nameElement = ""; private Map<String, PackageFrequencyTrie> entries = new TreeMap<>(new PackageComparator()); private int classCount = 0; public void visit(PackageFrequencyTrieVisitor visitor) { visit(visitor, 0); } private void visit(PackageFrequencyTrieVisitor visitor, int currentDepth) { for (Map.Entry<String, PackageFrequencyTrie> mapEntry : entries.entrySet()) { PackageFrequencyTrie subtree = mapEntry.getValue(); subtree.visit(visitor, currentDepth + 1); } visitor.visit(this, currentDepth); } public PackageFrequencyTrie() { } public PackageFrequencyTrie(PackageFrequencyTrie parent, String nameElement) { this.parent = parent; this.nameElement = nameElement; } public String getPackageName() { StringBuilder builder = new StringBuilder(); builder.append(this.nameElement); PackageFrequencyTrie parent = this.parent; while (parent != null) { if (StringUtils.isNotBlank(parent.nameElement)) { builder.insert(0, "."); builder.insert(0, parent.nameElement); } parent = parent.parent; } return builder.toString(); } public int getClassCount(boolean recursive) { int count = this.classCount; if (recursive) { for (Map.Entry<String, PackageFrequencyTrie> entry : this.entries.entrySet()) count += entry.getValue().getClassCount(true); } return count; } public PackageFrequencyTrie addClass(String qualifiedName) { String packageName = ClassNameUtil.getPackageName(qualifiedName); PackageFrequencyTrie subTrie = getSubTrie(packageName); subTrie.classCount++; return this; } private PackageFrequencyTrie getSubTrie(String packageName) { PackageFrequencyTrie current = this; StringTokenizer tokenizer = new StringTokenizer(packageName, "."); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); PackageFrequencyTrie next = current.entries.get(token); if (next == null) { next = new PackageFrequencyTrie(current, token); current.entries.put(token, next); } current = next; } return current; } }