package org.jboss.windup.graph;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import org.jboss.forge.furnace.util.OperatingSystemUtils;
import org.jboss.forge.furnace.util.Predicate;
import org.jboss.windup.graph.model.WindupFrame;
import org.jboss.windup.util.PathUtil;
import org.jboss.windup.util.furnace.FurnaceClasspathScanner;
/**
* This is used to provide a registry of {@link WindupFrame} subclasses for integration with Tinkerpop Frames.
*/
class GraphModelScanner
{
private static final Logger LOG = Logger.getLogger(GraphModelScanner.class.getName());
public static List<Class<? extends WindupFrame<?>>> loadFrames(FurnaceClasspathScanner scanner)
{
List<Class<? extends WindupFrame<?>>> results = new ArrayList<>();
// Scan for all classes form *Model.class.
Predicate<String> modelClassFilter = new Predicate<String>()
{
// Package prefixes to skip.
Set<String> skipPackages = new HashSet<>();
{
this.skipPackages.add("org.dom4j.");
this.skipPackages.add("groovy.model.");
this.skipPackages.add("com.sleepycat.persist.");
this.skipPackages.add("org.apache.lucene.");
this.skipPackages.add("org.openrdf.model.");
this.skipPackages.add("org.apache.bcel.");
this.skipPackages.add("org.eclipse.jdt.");
this.skipPackages.add("javax.");
this.skipPackages.add("org.jboss.weld.");
this.skipPackages.add("freemarker.");
}
@Override
public boolean accept(String path)
{
if (!path.endsWith("Model.class"))
return false;
final String clsName = PathUtil.classFilePathToClassname(path);
for (String pkg : this.skipPackages)
if (clsName.startsWith(pkg))
return false;
return true;
}
};
LOG.info("Looking for *Model classes...");
Iterable<Class<?>> classes = scanner.scanClasses(modelClassFilter);
for (Class<?> clazz : classes)
{
if (WindupFrame.class.isAssignableFrom(clazz))
{
LOG.fine(" Found: " + clazz);
@SuppressWarnings("unchecked")
Class<? extends WindupFrame<?>> windupVertexFrame = (Class<? extends WindupFrame<?>>) clazz;
results.add(windupVertexFrame);
}
else
{
LOG.fine(" Not adding [" + clazz.getCanonicalName() + "] to GraphTypeRegistry");
}
}
logLoadedModelTypes(results);
return results;
}
private static void logLoadedModelTypes(List<Class<? extends WindupFrame<?>>> types)
{
List<Class<? extends WindupFrame<?>>> list = new ArrayList<>(types);
Collections.sort(list, new Comparator<Class<? extends WindupFrame<?>>>()
{
@Override
public int compare(Class<? extends WindupFrame<?>> left, Class<? extends WindupFrame<?>> right)
{
if (left == right)
return 0;
if (left == null)
return 1;
if (right == null)
return -1;
return left.getCanonicalName().compareTo(right.getCanonicalName());
}
});
StringBuilder result = new StringBuilder();
for (Class<? extends WindupFrame<?>> frameType : list)
{
result.append("\t").append(frameType.getName()).append(NEWLINE);
}
LOG.info("Loaded [" + list.size() + "] WindupFrame sub-types [" + NEWLINE + result.toString() + "]");
}
private static final String NEWLINE = OperatingSystemUtils.getLineSeparator();
}