package com.github.czyzby.uedi.scanner.nongwt.impl;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectSet;
import com.github.czyzby.kiwi.util.gdx.collection.GdxSets;
/** Does not support automatic scanning. Instead, a fixed pool of scannable classes is provided and scanned when
* requested. While heavily relying on reflection, this might actually be a faster solution in case of huge contexts (if
* the components are not in separate root package, which they should be). Use when absolutely necessary.
*
* @author MJ */
public class FixedClassScanner extends AbstractClassScanner {
private final ObjectSet<Class<?>> context = GdxSets.newSet();
/** @param scannableClasses will be available for scanning. */
public FixedClassScanner(final Class<?>... scannableClasses) {
add(scannableClasses);
}
/** @param scannableClasses will be available for scanning. */
public void add(final Class<?>... scannableClasses) {
context.addAll(scannableClasses);
}
/** @param scannableClasses will be available for scanning. */
public void add(final Array<Class<?>> scannableClasses) {
context.addAll(scannableClasses);
}
@Override
public Iterable<Class<?>> getClassesImplementing(final Class<?> root, final Class<?>... interfaces) {
final ObjectSet<Class<?>> implementingClasses = GdxSets.newSet();
final String rootPackage = getPackageName(root);
for (final Class<?> scannableClass : context) {
if (getPackageName(scannableClass).startsWith(rootPackage) && isNotAbstract(scannableClass)
&& isInstanceOfAny(scannableClass, interfaces)) {
implementingClasses.add(scannableClass);
}
}
return implementingClasses;
}
}