001package net.sf.hajdbc.invocation;
002
003import java.util.SortedMap;
004
005import net.sf.hajdbc.Database;
006import net.sf.hajdbc.logging.Level;
007import net.sf.hajdbc.logging.Logger;
008import net.sf.hajdbc.logging.LoggerFactory;
009import net.sf.hajdbc.sql.ProxyFactory;
010
011public enum InvocationStrategies implements InvocationStrategy
012{
013        INVOKE_ON_ALL(new InvokeOnManyInvocationStrategy(new AllResultsCollector(new StandardExecutorProvider()))),
014        INVOKE_ON_ANY(new InvokeOnAnyInvocationStrategy(new InvokeOnOneInvocationStrategy(new NextDatabaseSelector()))),
015        INVOKE_ON_EXISTING(new InvokeOnManyInvocationStrategy(new ExistingResultsCollector())),
016        INVOKE_ON_NEXT(new InvokeOnOneInvocationStrategy(new NextDatabaseSelector())),
017        INVOKE_ON_PRIMARY(new InvokeOnOneInvocationStrategy(new PrimaryDatabaseSelector())),
018        TRANSACTION_INVOKE_ON_ALL(new InvokeOnManyInvocationStrategy(new AllResultsCollector(new TransactionalExecutorProvider(false)))),
019        END_TRANSACTION_INVOKE_ON_ALL(new InvokeOnManyInvocationStrategy(new AllResultsCollector(new TransactionalExecutorProvider(true)))),
020        ;
021        
022        private static final Logger logger = LoggerFactory.getLogger(SimpleInvoker.class);
023        
024        private final InvocationStrategy strategy;
025        
026        private InvocationStrategies(InvocationStrategy strategy)
027        {
028                this.strategy = strategy;
029        }
030        
031        @Override
032        public <Z, D extends Database<Z>, T, R, E extends Exception> SortedMap<D, R> invoke(ProxyFactory<Z, D, T, E> map, Invoker<Z, D, T, R, E> invoker) throws E
033        {
034                logger.log(Level.TRACE, "Invoking {0} using {1} strategy.", invoker, this);
035                return this.strategy.invoke(map, invoker);
036        }
037}