package buildcraft.api; import java.util.Arrays; import org.apache.commons.lang3.StringUtils; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.LoaderState; import buildcraft.api.core.BCLog; public class APIHelper { public static <T> T getInstance(String clsName, Class<T> baseVersion) { return getNamedInstance(clsName, "INSTANCE", baseVersion); } public static <T> T getInstance(String clsName, Class<T> baseVersion, T nullVersion) { return getNamedInstance(clsName, "INSTANCE", baseVersion, nullVersion); } @SuppressWarnings("unchecked") public static <T> T getNamedInstance(String clsName, String enumName, Class<T> baseVersion) { T instance = getNamedInstance(clsName, enumName, baseVersion, null); if (instance != null) return instance; Class<?>[] types = baseVersion.getClasses(); Class<?> voidType = null; for (Class<?> class1 : types) { if (baseVersion.isAssignableFrom(class1)) voidType = class1; } if (voidType != null) { Object[] arr = voidType.getEnumConstants(); if (arr == null) return null; Enum<?>[] eArr = ((Class<Enum<?>>) voidType).getEnumConstants(); for (Enum<?> e : eArr) { if (e.name().equals(enumName) && baseVersion.isInstance(e)) return (T) e; } } return null; } @SuppressWarnings("unchecked") public static <T> T getNamedInstance(String clsName, String enumName, Class<T> baseVersion, T nullVersion) { if (!Loader.instance().hasReachedState(LoaderState.PREINITIALIZATION)) throw new IllegalStateException( "Called this API too early, you are not allowed to use BC api before pre init!"); try { Class<?> cls = Class.forName(clsName); Object[] arr = cls.getEnumConstants(); if (arr == null) { return fail(clsName, nullVersion); } Enum<?>[] enumArr = ((Class<Enum<?>>) cls).getEnumConstants(); for (Enum<?> e : enumArr) { if (e.name().equals(enumName) && baseVersion.isInstance(e)) return (T) e; } return fail(clsName, nullVersion); } catch (ClassNotFoundException e) { return fail(clsName, nullVersion); } } private static <M> M fail(String clsName, M failure) { String[] split = clsName.split("\\."); String module; if (split.length < 2) { BCLog.logger.warn("Tried and failed to get the module name from " + Arrays.toString(split) + " (" + clsName + ")!"); module = "invalid"; } else { module = split[1]; } module = StringUtils.capitalize(module); String bcMod = "BuildCraft|" + module; if (Loader.isModLoaded(bcMod)) { BCLog.logger.warn("Failed to load the " + clsName + " dispite the appropriate buildcraft module being installed (" + module + ")"); } return failure; } }