/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.broadcast.common.diffuser; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.TreeMap; import org.apache.log4j.Logger; /** * Gestionnaire des modules de diffusion. */ public class DiffuserManager { private Map<String, Class<? extends Diffuser>> diffuserMap = new TreeMap<String, Class<? extends Diffuser>>(); public DiffuserManager() { diffuserMap.put("NONE", null); try { declareDiffuser("CFT", CFTDiffuser.class); } catch (NoSuchMethodException ex) { // Impossible Logger.getLogger(DiffuserManager.class).info("Impossible de d�clarer le diffuseur CFT", ex); } } /** * Construction du diffuseur. * * @param diffuserCode Code du diffuseur * @param arg argument de construction * * @return le diffuseur. * * @throws IllegalArgumentException diffuseur inconnue */ public Diffuser buildDiffuser(String diffuserCode, String arg) { try { Class clazz = getDiffuserClass(diffuserCode); if (clazz == null) { return null; } Constructor constructor = getConstructor(clazz); return (Diffuser)constructor.newInstance(arg); } catch (NoSuchMethodException ex) { // Cas normalement impossible throw new IllegalArgumentException("Ca merde grave dans le noyau " + diffuserCode, ex); } catch (InvocationTargetException ex) { throw new IllegalArgumentException("Echec lors de l'initialisation " + "de la m�thode de diffusion " + diffuserCode + " (" + arg + ") - " + ex.getTargetException().getLocalizedMessage(), ex); } catch (Exception ex) { throw new IllegalArgumentException("Echec lors de l'initialisation " + "de la m�thode de diffusion " + diffuserCode + " (" + arg + ") - " + ex.getLocalizedMessage(), ex); } } /** * Declare une methode de diffusion. * * @param diffuserCode code de diffusion. * @param diffuserClass class du diffuseur * * @throws NoSuchMethodException La classe ne possede pas de constructeur avec un argument de type String. * @throws IllegalArgumentException Le diffuseur est deja defini */ public void declareDiffuser(String diffuserCode, Class<? extends Diffuser> diffuserClass) throws NoSuchMethodException { getConstructor(diffuserClass); if (diffuserMap.containsKey(diffuserCode)) { throw new IllegalArgumentException("Le diffuseur " + diffuserCode + " est deja defini!"); } diffuserMap.put(diffuserCode, diffuserClass); } public String[] getDiffusersCode() { return diffuserMap.keySet().toArray(new String[]{}); } private Constructor getConstructor(Class clazz) throws NoSuchMethodException { return clazz.getDeclaredConstructor(String.class); } private Class<? extends Diffuser> getDiffuserClass(String diffuserCode) { if (!diffuserMap.containsKey(diffuserCode)) { throw new IllegalArgumentException("Code de diffusion inconnu " + diffuserCode); } return diffuserMap.get(diffuserCode); } }