package org.multibit.mbm; import com.google.common.cache.CacheBuilderSpec; import com.yammer.dropwizard.Service; import com.yammer.dropwizard.auth.CachingAuthenticator; import com.yammer.dropwizard.config.Environment; import com.yammer.dropwizard.logging.Log; import org.multibit.mbm.auth.hmac.HmacServerAuthenticator; import org.multibit.mbm.auth.hmac.HmacServerCredentials; import org.multibit.mbm.auth.hmac.HmacServerRestrictedToProvider; import org.multibit.mbm.core.model.User; import org.multibit.mbm.health.TemplatePropertyHealthCheck; import org.multibit.mbm.resources.BitcoinPaymentResource; import org.multibit.mbm.resources.cart.AdminCartResource; import org.multibit.mbm.resources.cart.PublicCartResource; import org.multibit.mbm.resources.item.AdminItemResource; import org.multibit.mbm.resources.item.PublicItemResource; import org.multibit.mbm.resources.role.AdminRoleResource; import org.multibit.mbm.resources.user.AdminUserResource; import org.multibit.mbm.resources.user.ClientUserResource; import org.multibit.mbm.resources.user.CustomerUserResource; import org.multibit.mbm.resources.user.SupplierUserResource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * <p>Service to provide the following to application:</p> * <ul> * <li>Provision of access to resources</li> * </ul> * <p>Use <code>java -jar mbm-develop-SNAPSHOT.jar server mbm.yml</code> to start MBM</p> * * @since 0.0.1 *   */ public class MultiBitMerchantService extends Service<MultiBitMerchantConfiguration> { public static final Log LOG = Log.forClass(MultiBitMerchantService.class); /** * Main entry point to the application * * @param args Command line arguments * * @throws Exception If something goes wrong */ public static void main(String[] args) throws Exception { new MultiBitMerchantService().run(args); } private MultiBitMerchantService() { super("mbm"); } @Override protected void initialize(MultiBitMerchantConfiguration configuration, Environment environment) { LOG.info("Reading configuration"); // Read the configuration // Start Spring context based on the provided location // TODO Externalise this into the configuration - Spring provides too much to ignore ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{ "/spring/mbm-context.xml" }); // Configure authenticator HmacServerAuthenticator hmacAuthenticator = context.getBean(HmacServerAuthenticator.class); CachingAuthenticator<HmacServerCredentials, User> cachingAuthenticator = CachingAuthenticator .wrap(hmacAuthenticator, CacheBuilderSpec.parse(configuration.getAuthenticationCachePolicy())); // Configure environment accordingly // Resources - admin (needs ROLE_ADMIN) environment.addResource(context.getBean(AdminUserResource.class)); environment.addResource(context.getBean(AdminRoleResource.class)); environment.addResource(context.getBean(AdminItemResource.class)); environment.addResource(context.getBean(AdminCartResource.class)); // Resources - client (needs ROLE_CLIENT) environment.addResource(context.getBean(ClientUserResource.class)); // Resources - customer (needs ROLE_CUSTOMER) environment.addResource(context.getBean(CustomerUserResource.class)); // Resources - supplier (needs ROLE_SUPPLIER) environment.addResource(context.getBean(SupplierUserResource.class)); // Resources - public (no authentication) environment.addResource(context.getBean(BitcoinPaymentResource.class)); environment.addResource(context.getBean(PublicCartResource.class)); environment.addResource(context.getBean(PublicItemResource.class)); // Health checks environment.addHealthCheck(new TemplatePropertyHealthCheck()); // Providers environment.addProvider(new HmacServerRestrictedToProvider<User>(cachingAuthenticator, "REST")); // TODO Add the database loader code here // if (configuration.loadInitialData) { // new DataBaseLoader.initialise(); // } } }