scan classpath for format handlers

This commit is contained in:
Benjamin Gamard 2018-03-26 20:51:53 +02:00
parent af217b4831
commit c9606f98d3
2 changed files with 47 additions and 9 deletions

View File

@ -1,6 +1,7 @@
package com.sismics.docs.core.util.format; package com.sismics.docs.core.util.format;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.sismics.util.ClasspathScanner;
import java.util.List; import java.util.List;
@ -11,17 +12,10 @@ import java.util.List;
*/ */
public class FormatHandlerUtil { public class FormatHandlerUtil {
/** /**
* List of format handlers. * List of format handlers scanned in the classpath.
*/ */
private static final List<Class<? extends FormatHandler>> FORMAT_HANDLERS = Lists.newArrayList( private static final List<Class<? extends FormatHandler>> FORMAT_HANDLERS = Lists.newArrayList(
DocxFormatHandler.class, new ClasspathScanner<FormatHandler>().findClasses(FormatHandler.class, "com.sismics.docs.core.util.format"));
PptxFormatHandler.class,
OdtFormatHandler.class,
VideoFormatHandler.class,
PdfFormatHandler.class,
TextPlainFormatHandler.class,
ImageFormatHandler.class
);
/** /**
* Find a suitable format handler for this MIME type. * Find a suitable format handler for this MIME type.

View File

@ -0,0 +1,44 @@
package com.sismics.util;
import com.google.common.collect.Sets;
import com.google.common.reflect.ClassPath;
import com.sismics.docs.core.util.format.PdfFormatHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Modifier;
import java.util.Set;
/**
* Classes scanner.
*/
public class ClasspathScanner<T> {
/**
* Logger.
*/
private static final Logger log = LoggerFactory.getLogger(PdfFormatHandler.class);
/**
* Find classes assignable from another.
*
* @param topClass Top class or interface
* @param pkg In this package
* @return Set of classes
*/
@SuppressWarnings("unchecked")
public Set<Class<T>> findClasses(Class<T> topClass, String pkg) {
Set<Class<T>> classes = Sets.newHashSet();
try {
for (ClassPath.ClassInfo classInfo : ClassPath.from(topClass.getClassLoader()).getTopLevelClasses(pkg)) {
Class<?> clazz = classInfo.load();
if (topClass.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers()) && !clazz.isInterface()) {
classes.add((Class<T>) clazz);
}
}
} catch (Exception e) {
log.error("Error loading format handlers", e);
}
log.info("Found " + classes.size() + " classes for " + topClass.getSimpleName());
return classes;
}
}