killbill-aplcache

util: profiles: revisit injection of DataSource for Shiro Make

3/17/2015 3:04:41 PM

Details

diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java b/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
index a692fc5..20a023a 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
@@ -19,6 +19,7 @@
 package org.killbill.billing.server.modules;
 
 import javax.servlet.ServletContext;
+import javax.sql.DataSource;
 
 import org.killbill.billing.account.glue.DefaultAccountModule;
 import org.killbill.billing.beatrix.glue.BeatrixModule;
@@ -51,6 +52,7 @@ import org.killbill.billing.junction.glue.DefaultJunctionModule;
 import org.killbill.billing.overdue.glue.DefaultOverdueModule;
 import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.billing.platform.glue.ReferenceableDataSourceSpyProvider;
 import org.killbill.billing.server.DefaultServerService;
 import org.killbill.billing.server.ServerService;
 import org.killbill.billing.server.config.KillbillServerConfig;
@@ -76,12 +78,22 @@ import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.RecordIdModule;
 import org.killbill.billing.util.glue.SecurityModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.billing.util.security.shiro.dao.SessionModelDao;
 import org.killbill.clock.Clock;
 import org.killbill.clock.ClockMock;
 import org.killbill.commons.embeddeddb.EmbeddedDB;
+import org.killbill.commons.jdbi.mapper.LowerToCamelBeanMapperFactory;
+import org.skife.jdbi.v2.ResultSetMapperFactory;
+import org.skife.jdbi.v2.tweak.ResultSetMapper;
+
+import com.google.inject.Provider;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
 
 public class KillbillServerModule extends KillbillPlatformModule {
 
+    public static final String SHIRO_DATA_SOURCE_ID = "shiro";
+
     public KillbillServerModule(final ServletContext servletContext, final KillbillServerConfig serverConfig, final KillbillConfigSource configSource) {
         super(servletContext, serverConfig, configSource);
     }
@@ -101,10 +113,16 @@ public class KillbillServerModule extends KillbillPlatformModule {
     protected void configureDao() {
         super.configureDao();
 
-        dbi.registerMapper(new AuditLogModelDaoMapper());
-        dbi.registerMapper(new RecordIdIdMappingsMapper());
-        queueDbi.registerMapper(new AuditLogModelDaoMapper());
-        queueDbi.registerMapper(new RecordIdIdMappingsMapper());
+        final Provider<DataSource> dataSourceSpyProvider = new ReferenceableDataSourceSpyProvider(daoConfig, SHIRO_DATA_SOURCE_ID);
+        requestInjection(dataSourceSpyProvider);
+        bind(DataSource.class).annotatedWith(Names.named(SHIRO_DATA_SOURCE_ID)).toProvider(dataSourceSpyProvider).asEagerSingleton();
+
+        final Multibinder<ResultSetMapperFactory> resultSetMapperFactorySetBinder = Multibinder.newSetBinder(binder(), ResultSetMapperFactory.class);
+        resultSetMapperFactorySetBinder.addBinding().toInstance(new LowerToCamelBeanMapperFactory(SessionModelDao.class));
+
+        final Multibinder<ResultSetMapper> resultSetMapperSetBinder = Multibinder.newSetBinder(binder(), ResultSetMapper.class);
+        resultSetMapperSetBinder.addBinding().to(AuditLogModelDaoMapper.class).asEagerSingleton();
+        resultSetMapperSetBinder.addBinding().to(RecordIdIdMappingsMapper.class).asEagerSingleton();
     }
 
     @Override
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java b/profiles/killbill/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
index 5f2da5a..df87dcc 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2015 Groupon, Inc
+ * Copyright 2014-2015 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -27,10 +27,7 @@ import org.apache.shiro.authc.SimpleAuthenticationInfo;
 import org.apache.shiro.codec.Base64;
 import org.apache.shiro.realm.jdbc.JdbcRealm;
 import org.apache.shiro.util.ByteSource;
-import org.killbill.billing.platform.jndi.ReferenceableDataSourceSpy;
 import org.killbill.billing.tenant.security.KillbillCredentialsMatcher;
-import org.killbill.commons.jdbi.guice.DaoConfig;
-import org.killbill.commons.jdbi.guice.DataSourceProvider;
 
 /**
  * @see {shiro.ini}
@@ -38,18 +35,14 @@ import org.killbill.commons.jdbi.guice.DataSourceProvider;
 public class KillbillJdbcRealm extends JdbcRealm {
 
     private static final String KILLBILL_AUTHENTICATION_QUERY = "select api_secret, api_salt from tenants where api_key = ?";
-    private static final String SHIRO_DATA_SOURCE_ID = "shiro";
 
-    private final DaoConfig config;
-
-    public KillbillJdbcRealm(final DaoConfig config) {
+    public KillbillJdbcRealm(final DataSource dataSource) {
         super();
 
-        this.config = config;
+        setDataSource(dataSource);
 
         configureSecurity();
         configureQueries();
-        configureDataSource();
     }
 
     @Override
@@ -71,10 +64,4 @@ public class KillbillJdbcRealm extends JdbcRealm {
     private void configureQueries() {
         setAuthenticationQuery(KILLBILL_AUTHENTICATION_QUERY);
     }
-
-    private void configureDataSource() {
-        final DataSource realDataSource = new DataSourceProvider(config, SHIRO_DATA_SOURCE_ID).get();
-        final DataSource dataSource = new ReferenceableDataSourceSpy(realDataSource, SHIRO_DATA_SOURCE_ID);
-        setDataSource(dataSource);
-    }
 }
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/security/TenantFilter.java b/profiles/killbill/src/main/java/org/killbill/billing/server/security/TenantFilter.java
index 00b7b49..242de3c 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/security/TenantFilter.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/security/TenantFilter.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2015 Groupon, Inc
+ * Copyright 2014-2015 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,6 +21,7 @@ package org.killbill.billing.server.security;
 import java.io.IOException;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.inject.Singleton;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -30,6 +31,7 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
 
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationToken;
@@ -38,10 +40,10 @@ import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
 import org.apache.shiro.realm.Realm;
 import org.killbill.billing.jaxrs.resources.JaxrsResource;
 import org.killbill.billing.server.listeners.KillbillGuiceListener;
+import org.killbill.billing.server.modules.KillbillServerModule;
 import org.killbill.billing.tenant.api.Tenant;
 import org.killbill.billing.tenant.api.TenantApiException;
 import org.killbill.billing.tenant.api.TenantUserApi;
-import org.killbill.commons.jdbi.guice.DaoConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,13 +61,14 @@ public class TenantFilter implements Filter {
     protected TenantUserApi tenantUserApi;
 
     @Inject
-    protected DaoConfig daoConfig;
+    @Named(KillbillServerModule.SHIRO_DATA_SOURCE_ID)
+    protected DataSource dataSource;
 
     private ModularRealmAuthenticator modularRealmAuthenticator;
 
     @Override
     public void init(final FilterConfig filterConfig) throws ServletException {
-        final Realm killbillJdbcRealm = new KillbillJdbcRealm(daoConfig);
+        final Realm killbillJdbcRealm = new KillbillJdbcRealm(dataSource);
         // We use Shiro to verify the api credentials - but the Shiro Subject is only used for RBAC
         modularRealmAuthenticator = new ModularRealmAuthenticator();
         modularRealmAuthenticator.setRealms(ImmutableList.<Realm>of(killbillJdbcRealm));
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index d1dfa5d..bdfaa5d 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2015 Groupon, Inc
+ * Copyright 2014-2015 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -24,8 +24,10 @@ import java.util.List;
 import java.util.Map;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
+import javax.sql.DataSource;
 
 import org.apache.shiro.web.servlet.ShiroFilter;
 import org.eclipse.jetty.servlet.FilterHolder;
@@ -90,6 +92,10 @@ public class TestJaxrsBase extends KillbillClient {
     @Inject
     protected TestApiListener busHandler;
 
+    @Inject
+    @Named(KillbillServerModule.SHIRO_DATA_SOURCE_ID)
+    protected DataSource shiroDataSource;
+
     protected DaoConfig daoConfig;
     protected KillbillServerConfig serverConfig;
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
index e2fd295..b9a1c36 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
@@ -61,7 +61,7 @@ public class TestKillbillJdbcRealm extends TestJaxrsBase {
         dbConfig.setPassword(helper.getPassword());
 
         final KillbillJdbcRealm jdbcRealm;
-        jdbcRealm = new KillbillJdbcRealm(daoConfig);
+        jdbcRealm = new KillbillJdbcRealm(shiroDataSource);
         jdbcRealm.setDataSource(new HikariDataSource(dbConfig));
 
         securityManager = new DefaultSecurityManager(jdbcRealm);
diff --git a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
index c389bd7..7620280 100644
--- a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
+++ b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/JDBCSessionDao.java
@@ -1,7 +1,9 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2015 Groupon, Inc
+ * Copyright 2014-2015 The Billing Project, LLC
  *
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
  * License.  You may obtain a copy of the License at:
  *
@@ -23,8 +25,6 @@ import javax.inject.Inject;
 
 import org.apache.shiro.session.Session;
 import org.apache.shiro.session.mgt.eis.CachingSessionDAO;
-import org.killbill.commons.jdbi.mapper.LowerToCamelBeanMapperFactory;
-import org.skife.jdbi.v2.DBI;
 import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
@@ -35,14 +35,10 @@ public class JDBCSessionDao extends CachingSessionDAO {
 
     private static final Logger log = LoggerFactory.getLogger(JDBCSessionDao.class);
 
-    private JDBCSessionSqlDao jdbcSessionSqlDao;
+    private final JDBCSessionSqlDao jdbcSessionSqlDao;
 
     @Inject
     public JDBCSessionDao(final IDBI dbi) {
-        if (dbi instanceof DBI) {
-            // TODO PIERRE Move to DBIProvider, once it's in util
-            ((DBI) dbi).registerMapper(new LowerToCamelBeanMapperFactory(SessionModelDao.class));
-        }
         this.jdbcSessionSqlDao = dbi.onDemand(JDBCSessionSqlDao.class);
     }
 
diff --git a/util/src/test/java/org/killbill/billing/DBTestingHelper.java b/util/src/test/java/org/killbill/billing/DBTestingHelper.java
index d61feee..40a5e4e 100644
--- a/util/src/test/java/org/killbill/billing/DBTestingHelper.java
+++ b/util/src/test/java/org/killbill/billing/DBTestingHelper.java
@@ -24,6 +24,8 @@ import org.killbill.billing.platform.test.PlatformDBTestingHelper;
 import org.killbill.billing.util.dao.AuditLogModelDaoMapper;
 import org.killbill.billing.util.dao.RecordIdIdMappingsMapper;
 import org.killbill.billing.util.io.IOUtils;
+import org.killbill.billing.util.security.shiro.dao.SessionModelDao;
+import org.killbill.commons.jdbi.mapper.LowerToCamelBeanMapperFactory;
 import org.skife.jdbi.v2.DBI;
 import org.skife.jdbi.v2.IDBI;
 
@@ -49,6 +51,7 @@ public class DBTestingHelper extends PlatformDBTestingHelper {
         final DBI dbi = (DBI) super.getDBI();
         dbi.registerMapper(new AuditLogModelDaoMapper());
         dbi.registerMapper(new RecordIdIdMappingsMapper());
+        dbi.registerMapper(new LowerToCamelBeanMapperFactory(SessionModelDao.class));
         return dbi;
     }