From c9606f98d31d00f1ca628417dd91c3a479d2391c Mon Sep 17 00:00:00 2001 From: Benjamin Gamard Date: Mon, 26 Mar 2018 20:51:53 +0200 Subject: [PATCH] scan classpath for format handlers --- .../core/util/format/FormatHandlerUtil.java | 12 ++--- .../com/sismics/util/ClasspathScanner.java | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 docs-core/src/main/java/com/sismics/util/ClasspathScanner.java diff --git a/docs-core/src/main/java/com/sismics/docs/core/util/format/FormatHandlerUtil.java b/docs-core/src/main/java/com/sismics/docs/core/util/format/FormatHandlerUtil.java index 9fa77aef..787739b4 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/util/format/FormatHandlerUtil.java +++ b/docs-core/src/main/java/com/sismics/docs/core/util/format/FormatHandlerUtil.java @@ -1,6 +1,7 @@ package com.sismics.docs.core.util.format; import com.google.common.collect.Lists; +import com.sismics.util.ClasspathScanner; import java.util.List; @@ -11,17 +12,10 @@ import java.util.List; */ public class FormatHandlerUtil { /** - * List of format handlers. + * List of format handlers scanned in the classpath. */ private static final List> FORMAT_HANDLERS = Lists.newArrayList( - DocxFormatHandler.class, - PptxFormatHandler.class, - OdtFormatHandler.class, - VideoFormatHandler.class, - PdfFormatHandler.class, - TextPlainFormatHandler.class, - ImageFormatHandler.class - ); + new ClasspathScanner().findClasses(FormatHandler.class, "com.sismics.docs.core.util.format")); /** * Find a suitable format handler for this MIME type. diff --git a/docs-core/src/main/java/com/sismics/util/ClasspathScanner.java b/docs-core/src/main/java/com/sismics/util/ClasspathScanner.java new file mode 100644 index 00000000..b67ec262 --- /dev/null +++ b/docs-core/src/main/java/com/sismics/util/ClasspathScanner.java @@ -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 { + /** + * 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> findClasses(Class topClass, String pkg) { + Set> 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) clazz); + } + } + } catch (Exception e) { + log.error("Error loading format handlers", e); + } + log.info("Found " + classes.size() + " classes for " + topClass.getSimpleName()); + return classes; + } +}