package de.lessvoid.nifty.loaderv2; import de.lessvoid.nifty.controls.Controller; import de.lessvoid.nifty.tools.Factory; import de.lessvoid.xml.tools.ClassHelper; import java.util.HashMap; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; /** * This class is used to create Controllers other than through the empty * constructor of a controller. If a factory is registered to a controller class * type, it will be responsible to create the new instance of the controller. * Otherwise, we try to instantiate the controller using an empty constructor. * * @author jfrenaud */ public class ControllerFactory { /** * The map containing the registered controllerFactories. */ @Nonnull private final Map<String, Factory<? extends Controller>> registeredControllersFactories = new HashMap<String, Factory<? extends Controller>>(); /** * Register factory to create a controllers. * <p> * @param <C> any type of Controller * @param controllerFactory The factory used to create a controller type. * @param controllerClass The class type that the factory will create. */ public <C extends Controller> void registerFactory(@Nonnull final Factory<C> controllerFactory, @Nonnull final Class<C> controllerClass) { registeredControllersFactories.put(controllerClass.getName(), controllerFactory); } /** * Unregister a factory previously registered, where the factory match the * provided class type. * * @param <C> any type of Controller * @param controllerClass The class type that the factory to remove can * create. */ public <C extends Controller> void unregisterFactory(@Nonnull final Class<C> controllerClass) { registeredControllersFactories.remove(controllerClass.getName()); } /** * Creates a Controller given a fully qualified class name. If a factory is * registered to a controller class type, it will be responsible to create the * new instance of the controller. Otherwise, we try to instantiate the * controller using an empty constructor. * * @param controllerClassName a fully qualified controller class name. * @return a new Controller, or null if not able to create one. */ @Nullable public Controller create(@Nullable final String controllerClassName) { if (controllerClassName == null) { return null; } if (registeredControllersFactories.containsKey(controllerClassName)) { return registeredControllersFactories.get(controllerClassName).createNew(); } else { return ClassHelper.getInstance(controllerClassName, Controller.class); } } }