package org.rosenvold.spring.convention.beanclassresolvers; import org.rosenvold.spring.convention.CandidateEvaluator; import org.rosenvold.spring.convention.InterfaceToImplementationMapper; import org.rosenvold.spring.convention.NameToClassResolver; import java.util.logging.Logger; /** * @author Kristian Rosenvold */ public class GenericNameToClassResolver implements NameToClassResolver { private final InterfaceToImplementationMapper[] mappers; Logger logger = Logger.getLogger(GenericNameToClassResolver.class.getName()); public GenericNameToClassResolver(InterfaceToImplementationMapper... mappers) { this.mappers = mappers; } public Class resolveBean(String name, final CandidateEvaluator candidateEvaluator) { final Class aClass = resolveClass(name); if (aClass != null && aClass.isInterface()) { final int mapperCount = mappers.length; for (int i = 0; i < mapperCount; i++){ final String beanClass = mappers[i].getBeanClassName(aClass); if (beanClass != null) { //logger.log(Level.INFO, "Found bean " + beanClass); final Class prospect = resolveClass(beanClass); if (prospect != null && candidateEvaluator.isBean(prospect)) return prospect; } } // logger.log(Level.INFO, "No resolution for " + name); return null; } //logger.log(Level.INFO, "Class resolution for " + name); return aClass != null && candidateEvaluator.isBean(aClass) ? aClass : null ; } private Class resolveClass(final String beanName) { try { return Class.forName(beanName); } catch (ClassNotFoundException ex) { return null; } } }