package org.solrmarc.index.utils; import org.apache.log4j.Logger; import org.solrmarc.driver.BootableMain; import org.solrmarc.index.extractor.AbstractValueExtractorFactory; import org.solrmarc.index.extractor.impl.custom.Mixin; import org.solrmarc.index.mapping.AbstractValueMappingFactory; import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner; import io.github.lukehutch.fastclasspathscanner.matchprocessor.InterfaceMatchProcessor; import io.github.lukehutch.fastclasspathscanner.matchprocessor.SubclassMatchProcessor; import java.util.LinkedHashSet; import java.util.Set; public class FastClasspathUtils { public final static Logger logger = Logger.getLogger(FastClasspathUtils.class); private static Set <Class<? extends AbstractValueExtractorFactory>> extractors = null; private static Set <Class<? extends AbstractValueMappingFactory>> mappers = null; private static Set <Class<? extends BootableMain>> bootables = null; private static Set <Class<? extends Mixin>> mixins = null; private static void getMatchingClasses() { extractors = new LinkedHashSet<>(); mappers = new LinkedHashSet<>(); mixins = new LinkedHashSet<>(); FastClasspathScanner scanner = new FastClasspathScanner("org") .matchSubclassesOf(AbstractValueExtractorFactory.class, new SubclassMatchProcessor<AbstractValueExtractorFactory>() { @Override public void processMatch(Class<? extends AbstractValueExtractorFactory> matchingClass) { logger.debug("Subclass of AbstractValueExtractorFactory: " + matchingClass); extractors.add(matchingClass); } }) .matchSubclassesOf(AbstractValueMappingFactory.class, new SubclassMatchProcessor<AbstractValueMappingFactory>() { @Override public void processMatch(Class<? extends AbstractValueMappingFactory> matchingClass) { logger.debug("Subclass of AbstractValueMappingFactory: " + matchingClass); mappers.add(matchingClass); } }) .matchClassesImplementing(Mixin.class, new InterfaceMatchProcessor<Mixin>() { @Override public void processMatch(Class<? extends Mixin> matchingClass) { logger.debug("Subclass of Mixin: " + matchingClass); mixins.add(matchingClass); } }); scanner.scan(); } public static Set<Class<? extends AbstractValueExtractorFactory>> getExtractorFactoryClasses() { if (extractors == null) { getMatchingClasses(); } return extractors; } public static Set<Class<? extends AbstractValueMappingFactory>> getMappingFactoryClasses() { if (mappers == null) { getMatchingClasses(); } return mappers; } public static Set<Class<? extends Mixin>> getMixinClasses() { if (mixins == null) { getMatchingClasses(); } return mixins; } private static void getMatchingBootableClasses() { bootables = new LinkedHashSet<>(); FastClasspathScanner scanner = new FastClasspathScanner("org") .matchSubclassesOf(BootableMain.class, new SubclassMatchProcessor<BootableMain>() { @Override public void processMatch(Class<? extends BootableMain> matchingClass) { bootables.add(matchingClass); } }); scanner.scan(); } public static Set<Class<? extends BootableMain>> getBootableMainClasses() { if (bootables == null) { getMatchingBootableClasses(); } return bootables; } }