/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.core.internal.transaction; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.matcher.Matchers; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; import com.google.inject.util.Providers; import org.seedstack.seed.core.internal.utils.MethodMatcherBuilder; import org.seedstack.seed.transaction.spi.TransactionHandler; import org.seedstack.seed.transaction.spi.TransactionManager; import org.seedstack.seed.transaction.spi.TransactionMetadata; import org.seedstack.seed.transaction.spi.TransactionMetadataResolver; import java.util.Set; @TransactionConcern class TransactionModule extends AbstractModule { private final TransactionManager transactionManager; private final Class<? extends TransactionHandler> defaultTransactionHandlerClass; private final Set<Class<? extends TransactionMetadataResolver>> transactionMetadataResolvers; TransactionModule(TransactionManager transactionManager, Class<? extends TransactionHandler> defaultTransactionHandlerClass, Set<Class<? extends TransactionMetadataResolver>> transactionMetadataResolvers) { this.transactionManager = transactionManager; this.defaultTransactionHandlerClass = defaultTransactionHandlerClass; this.transactionMetadataResolvers = transactionMetadataResolvers; } @Override protected void configure() { Multibinder<TransactionMetadataResolver> transactionMetadataResolverMultibinder = Multibinder.newSetBinder(binder(), TransactionMetadataResolver.class); for (Class<? extends TransactionMetadataResolver> transactionMetadataResolver : transactionMetadataResolvers) { transactionMetadataResolverMultibinder.addBinding().to(transactionMetadataResolver); } if (defaultTransactionHandlerClass != null) { bind(new TypeLiteral<Class<? extends TransactionHandler>>() { }).annotatedWith(Names.named("default")).toInstance(defaultTransactionHandlerClass); } else { bind(new TypeLiteral<Class<? extends TransactionHandler>>() { }).annotatedWith(Names.named("default")).toProvider(Providers.of(null)); } requestInjection(transactionManager); bindInterceptor(Matchers.any(), new MethodMatcherBuilder(TransactionalResolver.INSTANCE).build(), transactionManager.getMethodInterceptor()); bind(TransactionManager.class).toInstance(transactionManager); bind(TransactionMetadata.class); } }