package am.ik.categolj2.infra.dozer; import lombok.extern.slf4j.Slf4j; import org.dozer.DozerBeanMapper; import org.dozer.Mapper; import org.dozer.MappingException; import javax.annotation.PreDestroy; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @Slf4j public class LazyInitDozerMapper implements Mapper { private final Function<Class, Mapper> mapperProvider; private final ConcurrentHashMap<Class, Mapper> maperCache = new ConcurrentHashMap<>(1); public LazyInitDozerMapper(Function<Class, Mapper> mapperProvider) { this.mapperProvider = mapperProvider; } @Override public <T> T map(Object source, Class<T> destinationClass) throws MappingException { return this.maperCache.computeIfAbsent(Mapper.class, this.mapperProvider::apply).map(source, destinationClass); } @Override public void map(Object source, Object destination) throws MappingException { this.maperCache.computeIfAbsent(Mapper.class, this.mapperProvider::apply).map(source, destination); } @Override public <T> T map(Object source, Class<T> destinationClass, String mapId) throws MappingException { return this.maperCache.computeIfAbsent(Mapper.class, this.mapperProvider::apply).map(source, destinationClass, mapId); } @Override public void map(Object source, Object destination, String mapId) throws MappingException { this.maperCache.computeIfAbsent(Mapper.class, this.mapperProvider::apply).map(source, destination, mapId); } @PreDestroy public void destroy() { Mapper mapper = this.maperCache.get(Mapper.class); if (mapper instanceof DozerBeanMapper) { log.info("destroy {}", mapper); ((DozerBeanMapper) mapper).destroy(); } } }