All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.util.PackageUtility Maven / Gradle / Ivy

The newest version!
package prerna.util;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

import prerna.reactor.IReactor;
import prerna.util.Constants;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class PackageUtility {
	
	private static final Logger classLogger = LogManager.getLogger(PackageUtility.class);

	private final static char DOT = '.';
	private final static char SLASH = '/';
	private final static String CLASS_SUFFIX = ".class";
	private final static String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the given '%s' package exists?";

	public static List> getReactors(String javaPackage) {
		List> classes = PackageUtility.find(javaPackage);
		for (int i = 0; i < classes.size(); i++) {
			Class aClass = classes.get(i);
			boolean validReactor = false;
			// System.out.println(aClass.getSuperclass());
			// //Create an object of the class type
			try {
				Constructor constructor = aClass.getConstructor();
				constructor.newInstance();
				// System.out.println(aClass.getName());
				if (IReactor.class.isAssignableFrom(aClass)) {
					validReactor = true;
				}
			} catch (InstantiationException e) {
				// classLogger.error(Constants.STACKTRACE, e);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			}
			if (!validReactor) {
				classes.remove(i);
				System.out.println("This class does not implement IReactor " + aClass.getName());
			}
		}
		return classes;

	}

	private final static List> find(final String scannedPackage) {
		final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		final String scannedPath = scannedPackage.replace(DOT, SLASH);
		final Enumeration resources;
		try {
			resources = classLoader.getResources(scannedPath);
		} catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
			throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
		}
		final List> classes = new LinkedList>();
		while (resources.hasMoreElements()) {
			final File file = new File(resources.nextElement().getFile());
			classes.addAll(find(file, scannedPackage));
		}
		return classes;
	}

	private final static List> find(final File file, final String scannedPackage) {
		final List> classes = new LinkedList>();
		if (file.isDirectory()) {
			for (File nestedFile : file.listFiles()) {
				classes.addAll(find(nestedFile, scannedPackage));
			}
			// File names with the $1, $2 holds the anonymous inner classes, we
			// are not interested on them.
		} else if (file.getName().endsWith(CLASS_SUFFIX) && !file.getName().contains("$")) {

			final int beginIndex = 0;
			final int endIndex = file.getName().length() - CLASS_SUFFIX.length();
			final String className = file.getName().substring(beginIndex, endIndex);
			try {
				final String resource = scannedPackage + DOT + className;
				classes.add(Class.forName(resource));
			} catch (ClassNotFoundException ignore) {
			}
		}
		return classes;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy