package de.zalando.sprocwrapper.proxy.executors; import java.util.Collection; import java.util.List; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import de.zalando.sprocwrapper.proxy.InvocationContext; import de.zalando.typemapper.core.ValueTransformer; import de.zalando.typemapper.core.fieldMapper.GlobalValueTransformerRegistry; /** * This Executor wraps stored procedure calls that use advisory locks and / or need different statement timeouts set. * * @author jmussler */ public class GlobalTransformerExecutorWrapper implements Executor { private final Executor originalExecutor; private static final Logger LOG = LoggerFactory.getLogger(GlobalTransformerExecutorWrapper.class); public GlobalTransformerExecutorWrapper(final Executor e) { originalExecutor = e; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public Object executeSProc(final DataSource ds, final String sql, final Object[] args, final int[] types, final InvocationContext invocationContext, final Class<?> returnType) { final Object result = originalExecutor.executeSProc(ds, sql, args, types, invocationContext, String.class); if (result == null) { return null; } final ValueTransformer<?, ?> valueTransformerForClass = GlobalValueTransformerRegistry .getValueTransformerForClass(returnType); if (valueTransformerForClass != null) { if (Collection.class.isAssignableFrom(result.getClass())) { final List ret = Lists.newArrayList(); for (final Object o : (Collection<?>) result) { ret.add(valueTransformerForClass.unmarshalFromDb((String) o)); } return ret; } else { return valueTransformerForClass.unmarshalFromDb((String) result); } } else { LOG.error( "Could not find a global value transformer for type [{}]. RETURNING NULL instead of transformed [{}] value.", returnType, result); } return null; } }