package de.slikey.effectlib.math; import de.slikey.effectlib.util.ConfigUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; public class Transforms { private static final String TRANSFORM_BUILTIN_CLASSPATH = "com.elmakers.mine.bukkit.math"; private static Map<String, Class<?>> transformClasses = new HashMap<String, Class<?>>(); public static Transform loadTransform(ConfigurationSection base, String value) { if (base.isConfigurationSection(value)) { return loadTransform(ConfigUtils.getConfigurationSection(base, value)); } if (base.isDouble(value) || base.isInt(value)) { return new ConstantTransform(base.getDouble(value)); } if (base.isString(value)) { String equation = base.getString(value); if (equation.equalsIgnoreCase("t") || equation.equalsIgnoreCase("time")) { return new EchoTransform(); } return new EquationTransform(equation); } return new ConstantTransform(0); } public static Collection<Transform> loadTransformList(ConfigurationSection base, String value) { Collection<ConfigurationSection> transformConfigs = ConfigUtils.getNodeList(base, value); List<Transform> transforms = new ArrayList<Transform>(); if (transformConfigs != null) { for (ConfigurationSection transformConfig : transformConfigs) { transforms.add(loadTransform(transformConfig)); } } return transforms; } public static Transform loadTransform(ConfigurationSection parameters) { Transform transform = null; if (parameters != null && parameters.contains("class")) { String className = parameters.getString("class"); try { if (!className.contains(".")) { className = TRANSFORM_BUILTIN_CLASSPATH + "." + className; } Class<?> genericClass = transformClasses.get(className); if (genericClass == null) { try { genericClass = Class.forName(className + "Transform"); } catch (Exception ex) { genericClass = Class.forName(className); } if (!Transform.class.isAssignableFrom(genericClass)) { throw new Exception("Must extend Transform"); } transformClasses.put(className, genericClass); } @SuppressWarnings("unchecked") Class<? extends Transform> transformClass = (Class<? extends Transform>)genericClass; transform = transformClass.newInstance(); parameters.set("class", null); transform.load(parameters); } catch (Exception ex) { Bukkit.getLogger().warning("Error loading class " + className + ": " + ex.getMessage()); } } return transform == null ? new ConstantTransform(0) : transform; } }