1 /* Copyright (c) 2008 Sascha Kohlmann 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU Affero General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Affero General Public License for more details. 12 * 13 * You should have received a copy of the GNU Affero General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 package net.sf.eos.util; 17 18 import net.sf.eos.Supplier; 19 import net.sf.eos.config.ConfigurableSupplier; 20 import net.sf.eos.config.Configuration; 21 22 import static net.sf.eos.util.Conditions.checkArgumentNotNull; 23 24 public final class SupplierFactory<T> { 25 26 /** 27 * Creates a new instance of the {@link Supplier} class. The 28 * {@code supplier} must support a default Constructor. 29 * @param <T> the type of the {@code supplier} 30 * @param clazz the class instance of the {@code supplier} 31 * @return the {@code supplier} 32 * @throw IllegalArgumentException if it is not possible to create 33 * a new {@code supplier} 34 */ 35 public static final <T> Supplier<T> 36 newSupplier(final Class<? extends Supplier<T>> clazz) { 37 checkArgumentNotNull(clazz, "clazz is null"); 38 try { 39 final Supplier<T> p = clazz.newInstance(); 40 return p; 41 } catch (final InstantiationException e) { 42 throw new IllegalArgumentException(e); 43 } catch (final IllegalAccessException e) { 44 throw new IllegalArgumentException(e); 45 } 46 } 47 48 /** 49 * Creates a new instance of the {@link ConfigurableSupplier} class. 50 * The {@code supplier} must support a default Constructor. 51 * @param <T> the type of the {@code supplier} 52 * @param clazz the class instance of the {@code supplier} 53 * @return the {@code supplier} 54 * @throw IllegalArgumentException if it is not possible to create 55 * a new {@code supplier} 56 */ 57 public static final <T> ConfigurableSupplier<T> 58 newSupplier(final Class<? extends ConfigurableSupplier<T>> clazz, 59 final Configuration config) { 60 checkArgumentNotNull(config, "configuration is null"); 61 final ConfigurableSupplier<T> cp = 62 (ConfigurableSupplier<T>) newSupplier(clazz); 63 cp.configure(config); 64 return cp; 65 } 66 67 /** 68 * Creates a new instance of the {@link Supplier} class. The 69 * {@code supplier} must support a default Constructor. 70 * @param <T> the type of the {@code supplier} 71 * @param configName the name of the key that value in {@code config} 72 * is the name of a supplier class 73 * @param config the configuration containing the class name 74 * @return the {@code supplier} 75 * @throw IllegalArgumentException if it is impossible to create 76 * a new {@code supplier} 77 */ 78 public static final <T> Supplier<T> newSupplier( 79 final String configName, 80 final Configuration config) { 81 checkArgumentNotNull(configName, "config name is null"); 82 checkArgumentNotNull(config, "configuration is null"); 83 final String clazzName = config.get(configName); 84 return newSupplier(configName, config, clazzName); 85 } 86 87 /** 88 * Creates a new instance of the {@link Supplier} class. The 89 * {@code supplier} must support a default Constructor. 90 * @param <T> the type of the {@code supplier} 91 * @param configName the name of the key that value in {@code config} 92 * is the name of a supplier class 93 * @param config the configuration containing the class name 94 * @param defaultClazzName the default supplier class name 95 * @return the {@code supplier} 96 * @throw IllegalArgumentException if it is impossible to create 97 * a new {@code supplier} 98 */ 99 public static final <T> Supplier<T> newSupplier( 100 final String configName, 101 final Configuration config, 102 final String defaultClazzName) { 103 checkArgumentNotNull(configName, "config name is null"); 104 checkArgumentNotNull(config, "configuration is null"); 105 final String clazzName = config.get(configName, defaultClazzName); 106 try { 107 final Class<Supplier<T>> clazz = 108 (Class<Supplier<T>>) Class.forName(clazzName); 109 110 final Supplier<T> p = (Supplier<T>) newSupplier(clazz); 111 if (p instanceof ConfigurableSupplier) { 112 final ConfigurableSupplier<T> cp = 113 (ConfigurableSupplier<T>) p; 114 cp.configure(config); 115 } 116 return p; 117 } catch (final ClassNotFoundException e) { 118 throw new IllegalArgumentException(e); 119 } 120 } 121 }