001package javax.visrec.util; 002 003import java.lang.reflect.InvocationTargetException; 004import java.lang.reflect.Method; 005import java.util.Map; 006 007/** 008 * Generic builder interface, that all builders for machine learning algorithms implement. 009 * 010 * @author Zoran Sevarac 011 * @author Kevin Berendsen 012 * @param <T> type of the object to be returned by the builder. 013 * @since 1.0 014 */ 015public interface Builder<T> { 016 017 /** 018 * Builds and returns an object using properties set using available builder methods. 019 * 020 * @return object specified by the builder to build 021 */ 022 T build(); 023 024 /** 025 * Builds an object using properties from the specified input argument 026 * 027 * @param configuration properties for the builder, a map of key, value pairs. 028 * @return object specified by the builder to build 029 */ 030 default T build(Map<String, Object> configuration) { 031 Method[] methods = this.getClass().getDeclaredMethods(); 032 for (Method method : methods) { 033 if (!method.getName().equals("build") && method.getParameterCount() == 1 034 && configuration.containsKey(method.getName())) { 035 try { 036 method.invoke(this, configuration.get(method.getName())); 037 } catch (IllegalAccessException | InvocationTargetException | IllegalArgumentException e) { 038 throw new InvalidBuilderConfigurationException("Couldn't invoke '" + method.getName() + "'", e); 039 } 040 } 041 } 042 return build(); 043 } 044 045}