Friday, July 25, 2014

ModelMapper Generic Spring Integration

The Spring integration provided by ModelMapper (http://modelmapper.org/user-manual/spring-integration/) as of now could be enhanced as below in order to provide capability to pass in a delegate interface to use during setup:

package ...;

import org.modelmapper.Provider;
import org.modelmapper.Provider.ProvisionRequest;
import org.modelmapper.internal.util.Assert;
import org.springframework.beans.factory.BeanFactory;

public class EnhancedModelMapperSpringIntegration {
 private static class SpringProvider<S, D> implements
   Provider<D> {
  BeanFactory beanFactory;
  SourceBeanFactoryMapper<S, D> sourceBeanFactoryMapper;

  SpringProvider(BeanFactory beanFactory, SourceBeanFactoryMapper<S, D> sourceBeanFactoryMapper) {
   this.beanFactory = beanFactory;
   this.sourceBeanFactoryMapper = sourceBeanFactoryMapper;
  }

  @Override
  public D get(ProvisionRequest<D> request) {
   return sourceBeanFactoryMapper.map((S)request.getSource(), beanFactory);
  }
 }

 public static <S, D> Provider<?> fromSpring(BeanFactory beanFactory, SourceBeanFactoryMapper<S, D> sourceBeanFactoryMapper) {
  Assert.notNull(beanFactory);
  return new SpringProvider(beanFactory, sourceBeanFactoryMapper);
 }

}


package ...;

import org.springframework.beans.factory.BeanFactory;

public interface SourceBeanFactoryMapper<S, D> {

 D map(S s, BeanFactory beanFactory);

}